如何打印第三列到最后一列?
我试图从DbgView日志文件中删除前两列(我不感兴趣)。 我似乎无法find一个例子,从第3列开始直到行尾。 请注意,每行都有可变的列数。
…或者更简单的解决scheme: cut -f 3- INPUTFILE
只需添加正确的分隔符(-d)即可获得相同的效果。
awk '{for(i=3;i<=NF;++i)print $i}'
awk '{ print substr($0, index($0,$3)) }'
乔纳森·芬伯格的答案在一个单独的行上打印每个字段。 您可以使用printf
重build同一行上的输出logging,但也可以将这些字段向左跳转。
awk '{for (i=1; i<=NF-3; i++) $i = $(i+3); NF-=3; print}' logfile
awk '{$1=$2=$3=""}1' file
注意:这种方法会在1,2,3字段中留下“空白”,但如果您只是想查看输出,则不会出现问题。
awk -vm="\x0a" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
这将打印给定字段nr。,N之前的内容,并打印该行的所有其余部分,包括字段nr.N并保持原始间距(不重新格式化)。 如果字段的string也出现在行中的其他地方,这不是问题,这是daisaa的答案。
定义一个函数:
fromField () { awk -vm="\x0a" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}' }
像这样使用它:
$ echo " bat bi iru lau bost " | fromField 3 iru lau bost $ echo " bat bi iru lau bost " | fromField 2 bi iru lau bost
输出保持一切,包括尾随空格
适用于“/ n”是logging分隔符的文件,因此在行内没有该行。 如果你想用它与其他logging分隔符,然后使用:
awk -vm="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
例如。 只要不使用hex字符,几乎可以与所有文件一起工作。 1内线。
下面这行是什么?
awk'{$ 1 = $ 2 = $ 3 =“”; 打印}'文件
基于@ ghostdog74的build议。 当你过滤行时,我的行为会更好,即:
awk'/ ^ exim4-config / {$ 1 =“”; 打印}'文件
那么,你可以很容易地使用正则expression式来实现相同的效果。 假设分隔符是一个空格,它将如下所示:
awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'
下面的awk命令打印每行的最后N个字段,并在行尾打印一个新的行字符:
awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
查找下面的例子,列出/ usr / bin目录的内容,然后保存最后3行,然后使用awk打印每行的最后4列:
$ ls -ltr /usr/bin/ | tail -3 -rwxr-xr-x 1 root root 14736 Jan 14 2014 bcomps -rwxr-xr-x 1 root root 10480 Jan 14 2014 acyclic -rwxr-xr-x 1 root root 35868448 May 22 2014 skype $ ls -ltr /usr/bin/ | tail -3 | awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }' Jan 14 2014 bcomps Jan 14 2014 acyclic May 22 2014 skype
Perl解决scheme:
perl -lane 'splice @F,0,2; print join " ",@F' file
这些命令行选项被使用:
-
-n
循环input文件的每一行,不要自动打印每一行 -
-l
在处理之前删除换行符,然后将其添加回来 -
-a
自动分割模式 – 将input行分割成@F数组。 默认分割为空格 -
-e
执行Perl代码
splice @F,0,2
干净地从@F数组中删除列0和1
join " ",@F
使用每个元素之间的空格连接@F数组的元素
如果您的input文件是逗号分隔的,而不是空格分隔的,则使用-F, -lane
Python解决scheme:
python -c "import sys;[sys.stdout.write(' '.join(line.split()[2:]) + '\n') for line in sys.stdin]" < file
awk '{a=match($0, $3); print substr($0,a)}'
首先你find第三栏开头的位置。 使用substr,你将打印整个行($ 0),从该位置开始(在这个例子中是a)到该行的结尾。
有点晚了,但以上都不起作用。 试试这个,使用printf,在每个之间插入空格。 我select在最后没有换行符。
awk '{for(i=3;i<=NF;++i) printf("%s ", $i) }'
awk '{for (i=4; i<=NF; i++)printf("%c", $i); printf("\n");}'
从第4个字段到最后一个字段按照原始文件中的相同顺序打印logging
在Bash中,可以使用以下语法和位置参数:
while read -a cols; do echo ${cols[@]:2}; done < file.txt
了解更多信息:在Bash Hackers Wiki中处理位置参数
如果只是忽略前两个字段,并且在屏蔽这些字段时不需要空间(如上面的某些答案):
awk '{gsub($1" "$2" ",""); print;}' file
awk '{$1=$2=""}1' FILENAME | sed 's/\s\+//g'
前两列被清除, sed
删除前导空格。