177

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

该文件看起来像这样。随着时间的推移,更多的 A1/B1/C1 行将附加到它上面。

A1 123 456
B1 234 567
C1 345 678
A1 098 766
B1 987 6545
C1 876 5434

我试着用

tail -f file | grep A1 | awk '{print $NF}'

打印值 766,但没有输出。

有没有办法做到这一点?

4

11 回答 11

258

由于缓冲,您什么都看不到。当有足够的行数或到达文件末尾时,将显示输出。tail -f意味着等待更多的输入,但没有更多的线路,file因此管道grep永远不会关闭。

如果您-ftail输出中省略,则立即显示:

tail file | grep A1 | awk '{print $NF}'

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

tail file | awk '/A1/ {print $NF}'

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

awk '/A1/ {print $NF}' file

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

awk '/A1/ {print $NF}' file | tail -n1
于 2012-10-24T09:17:30.813 回答
39

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

awk '{print $(NF)}' 
于 2017-04-05T20:20:28.037 回答
13

一种使用方式awk

tail -f file.txt | awk '/A1/ { print $NF }'
于 2012-10-24T10:13:13.247 回答
12

您可以在没有 awk 的情况下仅使用一些管道来执行此操作。

tac file | grep -m1 A1 | rev | cut -d' ' -f1 | rev
于 2012-10-24T09:22:17.670 回答
4

也许这行得通?

grep A1 file | tail -1 | awk '{print $NF}'
于 2012-10-24T09:19:22.130 回答
2

您可以在以下位置完成所有操作awk

<file awk '$1 ~ /A1/ {m=$NF} END {print m}'
于 2012-10-24T10:29:48.780 回答
2

使用 Perl

$ cat rayne.txt
A1 123 456
B1 234 567
C1 345 678
A1 098 766
B1 987 6545
C1 876 5434


$ perl -lane ' /A1/ and $x=$F[2] ; END { print "$x" } ' rayne.txt
766

$
于 2019-02-09T14:08:18.483 回答
1

awk -F " " '($1=="A1") {print $NF}' FILE | tail -n 1

awk与字段分隔符-F一起使用,设置为空格“”。

使用pattern $1=="A1"action {print $NF},这将打印第一个字段为“A1”的每条记录中的最后一个字段。将结果通过管道传输到尾部并使用该-n 1选项仅显示最后一行。

于 2018-12-04T14:14:14.787 回答
1

不是这里的实际问题,但可能对某些人有所帮助:我在做awk "{print $NF}",请注意错误的引号。应该是awk '{print $NF}',这样外壳就不会膨胀$NF

于 2019-11-27T09:28:17.883 回答
0

在文件上执行:

awk 'ORS=NR%3?" ":"\n"' filename

你会得到你正在寻找的东西。

于 2013-01-31T17:14:13.563 回答
-3

ls -l | awk '{print $9}' | tail -n1

于 2017-02-23T19:38:36.840 回答