如何打印第三列到最后一列?

我试图从DbgView日志文件中删除前两列(我不感兴趣)。 我似乎无法find一个例子,从第3列开始直到行尾。 请注意,每行都有可变的列数。

…或者更简单的解决scheme: cut -f 3- INPUTFILE只需添加正确的分隔符(-d)即可获得相同的效果。

 awk '{for(i=3;i<=NF;++i)print $i}' 

乔纳森·芬伯格的答案在一个单独的行上打印每个字段。 您可以使用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删除前导空格。