39

如何tail在 Bash shell 下使用最后一个非空行?

例如,my_file.txt看起来像这样:

你好
hola
bonjour
(空行)
(空行)

显然,如果我这样做,tail -n 1 my_file.txt我会得到一个空行。就我而言,我想得到bonjour. 我怎么做?

4

8 回答 8

37

使用 tac,因此您不必阅读整个文件:

tac FILE |egrep -m 1 .
于 2010-04-14T16:13:39.590 回答
29

您可以使用 awk:

awk '/./{line=$0} END{print line}' my_file.txt

此解决方案的优点是仅使用一种工具。

于 2010-04-14T23:20:39.830 回答
26

grep先用过滤掉空行怎么样?

$ cat rjh
1
2
3


$ grep "." rjh | tail -1
3
于 2010-04-14T15:55:11.330 回答
6

如果可用,tac您可以使用。tail -r

tail -r | grep -m 1 '.'
于 2013-12-26T16:07:15.017 回答
4

如果您想省略任何空格,即行尾的空格/制表符,而不仅仅是空行

awk 'NF{p=$0}END{print p}' file
于 2010-04-14T23:26:50.513 回答
2

如果tail -r不可用并且您没有egrep,则以下内容可以很好地工作:

tac $FILE | grep -m 1 '.'

如您所见,它是前面两个答案的组合。

于 2016-04-26T15:18:39.627 回答
0

打印最后一个不包含制表符和空格的非空行,如下所示:

tac my_file.txt | grep -m 1 '[^[:blank:]]'

请注意,Grep 支持 POSIX 字符类[:blank:],即使它直到2020-01-01才在其手册页中记录。

文件可能包含其他不可见字符,因此[:space:]在某些情况下使用可能会更好。甚至所有空间都没有被覆盖,请参见此处

于 2019-03-15T10:34:27.130 回答
0

使用ag方式:

cat file.txt | ag "\S" | tail -1
于 2021-05-20T14:47:13.397 回答