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

时间:2012-10-24 09:13:24

标签: file awk tail

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

该文件看起来像这样。随着时间的推移,将附加更多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,但没有输出。

有办法做到这一点吗?

10 个答案:

答案 0 :(得分:147)

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

如果从-f中省略tail,则会立即显示输出:

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的记录,因此根本没有输出。这可以通过切换tailawk来解决,首先搜索文件然后再显示最后一行:

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

答案 1 :(得分:12)

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

awk '{print $(NF)}' 

答案 2 :(得分:10)

你可以在没有awk的情况下使用一些管道来做到这一点。

tac file | grep -m1 A1 | rev | cut -d' ' -f1 | rev

答案 3 :(得分:9)

使用awk的一种方式:

tail -f file.txt | awk '/A1/ { print $NF }'

答案 4 :(得分:2)

也许这有用吗?

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

答案 5 :(得分:1)

您可以在awk中执行所有操作:

<file awk '$1 ~ /A1/ {m=$NF} END {print m}'

答案 6 :(得分:0)

在文件上执行:

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

并且您将获得您正在寻找的内容。

答案 7 :(得分:0)

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

在字段分隔符 -F 设置为空格“”的情况下使用awk

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

答案 8 :(得分:0)

使用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

$

答案 9 :(得分:0)

不是这里的实际问题,但可能会帮助一些问题:我在做awk "{print $NF}"时,请注意错误的引号。应该为awk '{print $NF}',以便外壳程序不会展开$NF