【问题标题】:Output file lines from last to first in Bash在 Bash 中从最后到第一个输出文件行
【发布时间】:2011-12-22 11:30:33
【问题描述】:

我想显示我的日志文件的最后 10 行,从最后一行开始——就像普通的日志阅读器一样。我认为这将是 tail 命令的变体,但我在任何地方都找不到。

【问题讨论】:

  • 你的意思是从最后一行开始,然后是最后一行-1,最后一行-2等等...?

标签: linux bash shell tail


【解决方案1】:

GNU (Linux) uses the following:

tail -n 10 <logfile> | tac

tail -n 10 &lt;logfile&gt; 打印出日志文件的最后 10 行,tac(cat 倒写)颠倒顺序。

BSD (OS X)tail 使用 -r 选项:

tail -r -n 10 <logfile>

对于这两种情况,您可以尝试以下方法:

if hash tac 2>/dev/null; then tail -n 10 <logfile> | tac; else tail -n 10 -r <logfile>; fi

注意: GNU manual states 表示 BSD -r 选项“只能反转最多与其缓冲区一样大的文件,通常为 32 KiB”,而 tac 是更可靠。如果缓冲区大小有问题并且您不能使用tac,您可能需要考虑使用@ata's answer,它将功能写入bash。

【讨论】:

  • 我确定这是对的,但看起来 OSX shell 上不存在“tac”命令...
  • @Yarin 请参阅stackoverflow.com/questions/742466/… 了解tac 的一些替代方案,但并非所有这些都是可移植的。
  • 对不起,我不得不为“猫的无用使用”smallo.ruhr.de/award.html 叮你,因为 tail 有选项 -r 来颠倒顺序。所以tail -r -n 10 &lt;logfile&gt; 是更好的选择。作为奖励,tail -r 适用于 OSX、Solaris、AIX 等非 GNU 系统。
  • @RichardBronosky 不错的链接,我已经编辑了我的答案以包括-r 选项。
  • @RickSmith 可敬的谦虚,朋友。我于 1999 年获得该奖项,从那时起我一直很努力。此外,我在 1995 年到 1999 年期间只使用 GNU,然后才陷入 Posix 系统,并且不得不重新学习很多东西,因为管理员拒绝安装我习惯的所有糖。
【解决方案2】:

tac 做你想做的事。这是cat的反面。

tail -10 logfile | tac

【讨论】:

    【解决方案3】:

    我最终使用了tail -r,它可以在我的 OSX 上运行(tac 不能)

    tail -r -n10
    

    【讨论】:

    • 这是最好的答案,因为它不是 GNU 特定的,并且避免了“对 cat 的无用使用”。 smallo.ruhr.de/award.html
    • 不起作用root@elk:/# tail -r -n1 /var/log/logstash-test-output.log tail: invalid option -- 'r'
    • @KarlMorrison 这不适用于非 BSD 尾部命令。如需更多帮助,请参阅my answer...
    【解决方案4】:

    你可以用纯 bash 做到这一点:

    #!/bin/bash
    readarray file
    lines=$(( ${#file[@]} - 1 ))
    for (( line=$lines, i=${1:-$lines}; (( line >= 0 && i > 0 )); line--, i-- )); do
        echo -ne "${file[$line]}"
    done
    

    ./tailtac 10

    ./tailtac -10

    ./tailtac 100000

    ./tailtac

    【讨论】:

      【解决方案5】:

      这是反向打印输出的完美方法

      tail -n 10 <logfile>  | tac
      

      【讨论】:

      • 星号是干什么用的?
      • 加上“完美”这个词只会招来批评。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 2011-06-20
      • 2014-08-08
      • 2021-02-04
      相关资源
      最近更新 更多