如何tail
在 Bash shell 下使用最后一个非空行?
例如,my_file.txt
看起来像这样:
你好
hola
bonjour
(空行)
(空行)
显然,如果我这样做,tail -n 1 my_file.txt
我会得到一个空行。就我而言,我想得到bonjour
. 我怎么做?
使用 tac,因此您不必阅读整个文件:
tac FILE |egrep -m 1 .
您可以使用 awk:
awk '/./{line=$0} END{print line}' my_file.txt
此解决方案的优点是仅使用一种工具。
grep
先用过滤掉空行怎么样?
$ cat rjh
1
2
3
$ grep "." rjh | tail -1
3
如果可用,tac
您可以使用。tail -r
tail -r | grep -m 1 '.'
如果您想省略任何空格,即行尾的空格/制表符,而不仅仅是空行
awk 'NF{p=$0}END{print p}' file
如果tail -r
不可用并且您没有egrep
,则以下内容可以很好地工作:
tac $FILE | grep -m 1 '.'
如您所见,它是前面两个答案的组合。
打印最后一个不包含制表符和空格的非空行,如下所示:
tac my_file.txt | grep -m 1 '[^[:blank:]]'
请注意,Grep 支持 POSIX 字符类[:blank:]
,即使它直到2020-01-01才在其手册页中记录。
文件可能包含其他不可见字符,因此[:space:]
在某些情况下使用可能会更好。甚至所有空间都没有被覆盖,请参见此处。
使用ag方式:
cat file.txt | ag "\S" | tail -1