打印文件中一行的最后一列

Ray*_*yne 109 awk file tail

我有一个不断写入/更新的文件.我想找到包含特定单词的最后一行,然后打印该行的最后一列.

该文件看起来像这样.随着时间的推移,将附加更多的A1/B1/C1线.

A1 123 456
B1 234 567
C1 345 678
A1 098 766
B1 987 6545
C1 876 5434
Run Code Online (Sandbox Code Playgroud)

我试着用

tail -f file | grep A1 | awk '{print $NF}'
Run Code Online (Sandbox Code Playgroud)

打印值766,但没有输出.

有没有办法做到这一点?

Ola*_*che 172

你没有看到任何东西,因为缓冲.当有足够的行或文件结束时,显示输出.tail -f意味着等待更多输入,但没有更多的行file,因此管道grep永远不会关闭.

如果省略-ftail输出会立即显示:

tail file | grep A1 | awk '{print $NF}'
Run Code Online (Sandbox Code Playgroud)

@EdMorton当然是对的.awk也可以搜索A1,这会缩短命令行

tail file | awk '/A1/ {print $NF}'
Run Code Online (Sandbox Code Playgroud)

或没有尾巴,显示包含所有行的最后一列 A1

awk '/A1/ {print $NF}' file
Run Code Online (Sandbox Code Playgroud)

感谢@ MitchellTracy的评论,tail可能会错过包含的记录A1,因此根本没有输出.这可以通过切换tailawk首先搜索文件然后显示最后一行来解决:

awk '/A1/ {print $NF}' file | tail -n1
Run Code Online (Sandbox Code Playgroud)

  • 你永远不需要grep + awk,因为awk可以做它自己的RE比较."grep A1 | awk'{print $ NF}'"应该只是"awk'/ A1/{print $ NF}'".另外,如果你没有使用tail -f那么你根本不需要尾巴,yoiu可以这样做:awk'/ A1/{f = $ NF} END {print f}'文件 (13认同)

小智 17

要打印一行的最后一列,只需使用$(NF):

awk '{print $(NF)}' 
Run Code Online (Sandbox Code Playgroud)


小智 10

只需要一些管道就可以不用awk就可以做到这一点.

tac file | grep -m1 A1 | rev | cut -d' ' -f1 | rev
Run Code Online (Sandbox Code Playgroud)


Ste*_*eve 9

一种方式使用awk:

tail -f file.txt | awk '/A1/ { print $NF }'
Run Code Online (Sandbox Code Playgroud)