我试图从 DbgView 日志文件中删除前两列(我对其中的两列不感兴趣)。我似乎找不到一个从第3列开始直到行尾打印的例子。注意,每一行的列数是可变的。
awk '{for(i=3;i<=NF;++i)print $i}'
使用正则表达式可以很容易地实现同样的效果。假设分隔符是一个空格,它看起来像:
awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'
... 或者一个更简单的解决方案: cut -f 3- INPUTFILE只需添加正确的分隔符(- d) ,你就会得到同样的效果。
cut -f 3- INPUTFILE
Jonathan Feinberg 的回答将每个字段打印在单独的行上。您可以使用 printf为同一行上的输出重新构建记录,但是您也可以将字段向左移动一个跳转。
printf
awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
awk '{$1=$2=$3=""}1' file
注意: 这个方法会在1,2,3个字段中留下“空白”,但是如果你只想查看输出,这不是问题。
下面这句怎么样:
awk '{$1=$2=$3=""; print}' file
Based on @ghostdog74 suggestion. Mine should behave better when you filter lines, i.e.:
awk '/^exim4-config/ {$1=""; print }' file
awk '{ print substr($0, index($0,$3)) }'
解决方案如下: Http://www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-count-179078/
这里有点晚了,但是上面的一切似乎都不起作用。尝试使用 printf 在每个。我选择在最后没有换行。
awk '{for(i=3;i<=NF;++i) printf("%s ", $i) }'
awk -v m="\x0a" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
这将删除给定字段 nr,N 之前的内容,并打印行的所有其余内容,包括字段 nr.N 和维护原始间距(它不会重新格式化)。字段的字符串是否也出现在行中的其他地方并不重要,这就是 daisaa 的答案的问题所在。
定义一个函数:
fromField () { awk -v m="\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’是记录分隔符的文件,这样就不会在行中出现新行字符。如果您想将它与其他记录分隔符一起使用,请使用:
awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
比如说。只要不使用十六进制 char,几乎所有文件都能正常工作。1号线内。
awk '{for (i=4; i<=NF; i++)printf("%c", $i); printf("\n");}'
按照原始文件中的顺序打印从第4个字段到最后一个字段的记录
下面的 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 解决方案:
perl -lane 'splice @F,0,2; print join " ",@F' file
使用以下命令行选项:
-n循环输入文件的每一行,不要自动打印每一行
-n
-l在处理之前删除新行,然后再将它们添加回来
-l
-a自动分割模式-将输入行分割成@F 数组。默认为在空格上分割
-a
执行 perl 代码
splice @F,0,2干净地从@F 数组中删除了列0和列1
splice @F,0,2
join " ",@F使用每个元素之间的空格连接@F 数组的元素
join " ",@F
如果输入文件以逗号分隔,而不是以空格分隔,则使用 -F, -lane
-F, -lane
Python 解决方案:
python -c "import sys;[sys.stdout.write(' '.join(line.split()[2:]) + '\n') for line in sys.stdin]" < file
如果只是忽略前两个字段,并且在屏蔽这些字段时不需要空格(就像上面的一些答案那样) :
awk '{gsub($1" "$2" ",""); print;}' file
在 Bash 中,可以对位置参数使用以下语法:
while read -a cols; do echo ${cols[@]:2}; done < file.txt
了解更多: 处理位置参数 at Bash Hacker Wiki
awk '{$1=$2=""}1' FILENAME | sed 's/\s\+//g'
清除前两列后,sed删除前导空格。
sed
awk '{a=match($0, $3); print substr($0,a)}'
首先找到第三列开始的位置。 使用 subr,您将打印从位置(在本例中为 a)到行尾的整行($0)。
在 AWK 列中称为字段,因此 NF 是键
所有行:
awk -F '<column separator>' '{print $(NF-2)}' <filename>
只能坐第一排:
awk -F '<column separator>' 'NR<=1{print $(NF-2)}' <filename>
如果要在同一行中打印第3行后面的列,可以使用:
awk '{for(i=3; i<=NF; ++i) printf "%s ", $i; print ""}'
例如:
Mar 09:39 20180301_123131.jpg Mar 13:28 20180301_124304.jpg Mar 13:35 20180301_124358.jpg Feb 09:45 Cisco_WebEx_Add-On.dmg Feb 12:49 Docker.dmg Feb 09:04 Grammarly.dmg Feb 09:20 Payslip 10459 %2828-02-2018%29.pdf
它将印刷:
20180301_123131.jpg 20180301_124304.jpg 20180301_124358.jpg Cisco_WebEx_Add-On.dmg Docker.dmg Grammarly.dmg Payslip 10459 %2828-02-2018%29.pdf
我们可以看到,即使有空格,工资单也显示在正确的线上。
awk '{print ""}{for(i=3;i<=NF;++i)printf $i" "}'