139

我正在尝试从 DbgView 日志文件中删除前两列(我不感兴趣)。我似乎找不到从第 3 列开始打印到行尾的示例。请注意,每一行都有可变数量的列。

4

19 回答 19

127
awk '{for(i=3;i<=NF;++i)print $i}' 
于 2009-10-21T16:43:10.820 回答
127

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

于 2009-10-21T17:11:26.733 回答
117
awk '{ print substr($0, index($0,$3)) }'

在这里找到的解决方案:
http ://www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-count-179078/

于 2011-07-08T21:52:26.717 回答
37

Jonathan Feinberg的答案将每个字段打印在单独的行上。您可以使用printf重建记录以在同一行上输出,但您也可以将字段移动到左侧。

awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
于 2009-10-21T18:05:59.933 回答
22
awk '{$1=$2=$3=""}1' file

注意:此方法会在 1、2、3 字段中留下“空白”,但如果您只想查看输出,这不是问题。

于 2009-10-24T02:33:36.017 回答
16

例如,如果要在同一行中打印第三列之后的列,可以使用:

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

正如我们所看到的,即使有空格,工资单也显示在正确的行中。

于 2018-03-06T11:55:19.257 回答
9

以下行呢:

awk '{$1=$2=$3=""; 打印}'文件

基于@ghostdog74 的建议。当您过滤行时,我的表现应该更好,即:

awk '/^exim4-config/ {$1=""; 打印}'文件
于 2011-06-01T15:38:21.283 回答
8
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)}'

例如。只要它们不使用十六进制字符 nr,几乎适用于所有文件。1 行内。

于 2014-04-16T19:36:17.397 回答
7
awk '{a=match($0, $3); print substr($0,a)}'

首先,您找到第三列开始的位置。使用 substr 您将从位置(在本例中为 a)开始打印整行($0)到行尾。

于 2017-11-10T11:08:13.873 回答
5

以下 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
于 2014-12-08T14:44:04.047 回答
3

好吧,您可以使用正则表达式轻松实现相同的效果。假设分隔符是一个空格,它看起来像:

awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'
于 2009-10-21T16:46:58.317 回答
3

Perl 解决方案:

perl -lane 'splice @F,0,2; print join " ",@F' file

使用这些命令行选项:

  • -n循环输入文件的每一行,不要自动打印每一行

  • -l在处理之前删除换行符,然后将它们添加回来

  • -a自动拆分模式 - 将输入行拆分为 @F 数组。默认为空格分割

  • -e执行 perl 代码

splice @F,0,2从 @F 数组中干净地删除第 0 列和第 1 列

join " ",@F连接 @F 数组的元素,在每个元素之间使用空格

如果您的输入文件是逗号分隔的,而不是空格分隔的,请使用-F, -lane


Python解决方案:

python -c "import sys;[sys.stdout.write(' '.join(line.split()[2:]) + '\n') for line in sys.stdin]" < file

于 2015-09-16T00:08:49.843 回答
3
awk '{print ""}{for(i=3;i<=NF;++i)printf $i" "}'
于 2019-10-01T12:14:42.827 回答
1

这里有点晚了,但上述方法似乎都不起作用。试试这个,使用 printf,在每个之间插入空格。我选择最后没有换行符。

awk '{for(i=3;i<=NF;++i) printf("%s ",  $i) }'
于 2013-01-24T20:41:34.993 回答
1
awk '{for (i=4; i<=NF; i++)printf("%c", $i); printf("\n");}'

以与原始文件中相同的顺序打印从第 4 个字段到最后一个字段的记录

于 2014-11-14T10:14:07.817 回答
1

在 Bash 中,您可以将以下语法与位置参数一起使用:

while read -a cols; do echo ${cols[@]:2}; done < file.txt

了解更多:在 Bash Hackers Wiki 上处理位置参数

于 2016-04-10T03:01:24.620 回答
0

如果它只是忽略前两个字段,并且在屏蔽这些字段时不想要空格(就像上面的一些答案一样):

awk '{gsub($1" "$2" ",""); print;}' file
于 2016-02-21T04:10:29.200 回答
0
awk '{$1=$2=""}1' FILENAME | sed 's/\s\+//g'

前两列被清除,sed删除前导空格。

于 2016-11-23T12:48:35.933 回答
-2

在 AWK 中,列称为字段,因此 NF 是关键

所有行:

awk -F '<column separator>' '{print $(NF-2)}' <filename>

仅第一行:

awk -F '<column separator>' 'NR<=1{print $(NF-2)}' <filename>
于 2017-12-01T16:02:16.983 回答