如何在Bash shell下使用tail
获取最后一个非空行?
例如,my_file.txt
看起来像这样:
您好
HOLA
卓悦
(空行)
(空行)
显然,如果我tail -n 1 my_file.txt
,我会得到一个空行。在我的情况下,我想获得bonjour
。我该怎么做?
答案 0 :(得分:32)
使用tac,所以你不必阅读整个文件:
tac FILE |egrep -m 1 .
答案 1 :(得分:25)
您可以使用Awk:
awk '/./{line=$0} END{print line}' my_file.txt
此解决方案的优势在于只使用一种工具。
答案 2 :(得分:21)
如何首先使用grep
过滤空白行?
$ cat rjh
1
2
3
$ grep "." rjh | tail -1
3
答案 3 :(得分:6)
如果可用,您可以使用tac
代替tail -r
。
tail -r | grep -m 1 '.'
答案 4 :(得分:3)
如果你想省略任何空格,即行尾的空格/制表符,而不只是空行
awk 'NF{p=$0}END{print p}' file
答案 5 :(得分:1)
如果tail -r
不可用但您没有egrep
,则以下情况很有效:
tac $FILE | grep -m 1 '.'
正如您所看到的,它是以前两个答案的组合。
答案 6 :(得分:0)
打印最后一个非空的视觉行:
tac my_file.txt | grep -vm 1 '^[[:space:]]*$'
或
awk 'BEGIN{RS="\r?\n[[:space:]]*"}END{print}' my_file.txt
DOS / Windows文本文件可能需要\r?
。
诸如[:space:]
之类的字符类至少可以与awk
(即gawk
)和grep
的GNU版本一起使用。对于其他一些实现,您必须在代码中手动枚举空格字符,即将[:space:]
替换为\t \n\f\r\v
。我不知道处理文件中退格字符(\b
)的正确方法是什么。
以下仅适用于[:space:]
:
tac my_file.txt | grep -m 1 '[^[:space:]]'
答案 7 :(得分:0)
使用 ag 方式:
cat file.txt | ag "\S" | tail -1