【问题标题】:How do I get the last non-empty line of a file using tail in Bash?如何在 Bash 中使用 tail 获取文件的最后一个非空行?
【发布时间】:2011-02-07 23:54:19
【问题描述】:

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

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

你好
你好
卓悦
(空行)
(空行)

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

【问题讨论】:

标签: bash line tail


【解决方案1】:

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

tac FILE |egrep -m 1 .

【讨论】:

  • @vault 不在 Sierra,2016 年。
  • @gsamaras 尝试在触摸栏上从右向左滑动 ?
  • 则@vault 不会显示gtac 找不到的错误。 . . ;)
  • @gsamaras 触摸栏也是可舔的 ?。而且,顺便说一句,这在 CEntOS 7.5 上对我有用(vagrant box bento/centos-7.5)。
  • 为什么使用egrep 而不是grep?正则表达式中没有任何“扩展”内容。
【解决方案2】:

你可以使用 awk:

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

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

【讨论】:

  • 缺点:需要读取整个文件,并将每一行分配给 awk 变量 -> 这可能会占用大量 CPU 和 IO。
  • 是的,解决方案很简单,但远非高效。一个有效的解决方案是打开文件,寻找到最后并向后扫描。
【解决方案3】:

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

$ cat rjh
1
2
3


$ grep "." rjh | tail -1
3

【讨论】:

  • 或者,而不是'cat rjh | grep“。” |尾 -1',使用 'grep 。 rjh |尾巴 -1'
  • 谁能解释一下 grep "."部分?
  • grep "." 中,那个句点是正则表达式,意思是“任何字符”。在正则表达式中,空行有一个开头 (^)、一个结尾($ 或 \n),但中间没有任何内容,因此对句点进行 grepping 只会返回包含字符的行。例如,不为空。
  • 简单> 高效。奖励:... | grep \. | tail -1 短一个字符!
【解决方案4】:

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

tail -r | grep -m 1 '.'

【讨论】:

  • tail(1) 的哪些版本有-r 选项? GNU coreutils 中的那个没有,cf。 debbugs.gnu.org/18808
  • 这个解决方案的问题是,如果你正在扫描的文件是一个shell脚本文件,那么它只会过滤回显输出而不是实际的文件内容,尝试1)创建一个脚本文件一些简单的回显命令; 2)将完整的文件路径粘贴到控制台,最后输入“|tail -1”;请注意,它只会输出您最后一个 echo 命令的输出,而不是整个 echo 命令...
【解决方案5】:

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

awk 'NF{p=$0}END{print p}' file

【讨论】:

    【解决方案6】:

    如果tail -r 不可用并且您没有egrep,则以下方法可以正常工作:

    tac $FILE | grep -m 1 '.'

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

    【讨论】:

    • egrepgrep 相同,只是不需要输入... | grep "my[regex]Expr",您只需输入... | egrep my[regexExpr],这有点复杂,因为您可能会遇到语法问题,但是一些转义字符应该可以解决问题。
    【解决方案7】:

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

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

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

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

    【讨论】:

    • 如果要添加更多行,请更改-m之后的数字并在末尾添加|tac以使其恢复正确的顺序
    【解决方案8】:

    使用ag方式:

    cat file.txt | ag "\S" | tail -1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-13
      • 1970-01-01
      • 2014-11-10
      • 1970-01-01
      • 2012-09-13
      • 2021-07-17
      • 1970-01-01
      相关资源
      最近更新 更多