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


135

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

该文件看起来像这样。随着时间的流逝,更多的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,但没有任何输出。

有没有办法做到这一点?

Answers:


199

由于缓冲,您什么都看不到。当行数足够多或到达文件末尾时,将显示输出。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,因此您根本没有输出。这可以通过切换tail和来解决awk,首先搜索文件,然后显示最后一行:

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

14
您永远不需要grep + awk,因为awk可以自己进行RE比较。“ grep A1 | awk'{print $ NF}'”应该只是“ awk'/ A1 / {print $ NF}'”。另外,如果您不使用tail -f,则根本不需要tail,yoiu可以这样做:awk'/ A1 / {f = $ NF} END {print f}'文件
Ed Morton

这不太正确,因为该列可能不会出现在raw tail给您的窗口中。除非您知道它会以一定的频率出现,否则它会更安全awk '/A1/ {print $NF}' file | tail -n1
米切尔·特雷西


12

一种使用方式awk

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

我认为这是发布的问题(+1!)的正确解决方案,但现在我明白了我的意思。OP希望从文件的LAST LINE获取最后一个字段,但是如果您使用tail -f,则没有LAST LINE。也许他是当前文件中的最后一行,在这种情况下,请参阅我的其他评论之一。
Ed Morton 2012年

非常好,简单。竖起大拇指。拒绝使用awk的神秘语法:)
stamster

11

您可以只使用一些管道而无需awk来执行此操作。

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

这可以解决您的问题,但实际上并没有使用awk。希望它对您足够好。
miono 2012年

4

也许这可行吗?

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

2

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

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

1
您不需要split()和数组,只需保存最后一个字段并打印:awk'/ A1 / {f = $ NF} END {print f}'文件
Ed Morton 2012年

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

$

看起来太复杂了,快去做吧perl -lane 'print $F[2] if /A1/' rayne.txt
Hi-Angel

1
@ Hi-Angel ..问题要求最后一次出现A1。您的答案将打印所有匹配项。.顺便说一句,如果您喜欢我的答案,请
投票赞成

1

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

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

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


0

在文件上执行此操作:

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

您将得到想要的东西。


0

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.