如何在Bash中使用tail获取文件的最后一个非空行?

时间:2010-04-14 15:52:09

标签: bash line tail

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

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

  

您好
  HOLA
  卓悦
  (空行)
  (空行)

显然,如果我tail -n 1 my_file.txt,我会得到一个空行。在我的情况下,我想获得bonjour。我该怎么做?

8 个答案:

答案 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