【问题标题】:How to start from the last line with tail?如何从尾部的最后一行开始?
【发布时间】:2015-01-29 16:17:00
【问题描述】:

我有一个巨大的日志文件。我需要找到一些东西并打印最后一行。像这样:

tail -n +1 "$log" | awk '$9 ~ "'$something'" {print $0}' | tail -n1

但是当我执行这个命令时,tail 从第一行开始读取所有行。并运行几分钟。

如何从最后一行开始阅读并在找到某些内容时停止?所以也许我不需要阅读所有行并且只运行几秒钟。因为我只需要关于$something 的最后一行。

【问题讨论】:

  • 您需要包含某个单词的最后一行吗?如果是这样,您应该结合 greptail
  • 是的,我只需要打印关于 $something 的最后一行。但没有阅读所有行。
  • 注意tail -n+X(从第X行打印)和tail -X/tail -nX(尾X最后一行)之间的区别。

标签: bash awk grep tail


【解决方案1】:

注意你说的是tail -n +1 "$log"tail 解释为:从1 行开始读取。所以你实际上是在做cat "$log"

您可能想说tail -n 1 "$log"(在1 之前没有+)以获取最后的n 行。

另外,如果您想获得$something 的最后一个匹配项,您可能需要使用tac。这会向后打印一个文件:首先是最后一行,然后是倒数第二行……最后是第一行。

如果你这样做了

tac "$log" | grep -m1 "$something"

这将打印$something 的最后一个匹配然后退出,因为-mX 打印第一个X 匹配。

当然你也可以使用awk

tac "$log" | awk -v pattern="$something" '$9 ~ pattern {print; exit}'

注意-v 的用法是给awk 变量。这样可以避免在代码中混淆单引号和双引号。

【讨论】:

  • 谢谢,这对我有用。我可以使用超过 1 个模式吗?比如 if ~ something and something2,打印。
  • @iyonizer 当然可以,例如:awk -v pattern="$something" '$9 ~ pattern && $7==7 {print; exit}'。如果您希望同时完成这两个条件,请注意 && 以引入其他条件。如果是 OR,则使用 ||
【解决方案2】:

tac $FILE | grep $SOMETHING -m 1

tac: cat 的反面:-)

grep -m: 搜索并在第一次出现时停止

【讨论】:

    【解决方案3】:

    使用tac 代替tail。它将反转文件,您可以在第一次 grep 时退出:

    tac "$log" | awk '$9 ~ "'$something'" {print $0;exit}'
    

    【讨论】:

    • 不要将 shell 变量的值用作 awk 脚本语法的一部分,否则根据该 shell 变量的值,您可能会产生各种可怕的后果。使用-v 来用shell 变量的值来初始化一个awk 变量。
    【解决方案4】:

    tail -1000 只取文件的最后 1000 行。 你可以 grep 那部分,但你不知道你 grep 的事情是否发生在前面的行中。没有办法grep“向后”。

    【讨论】:

      猜你喜欢
      • 2021-09-14
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 2020-11-18
      • 1970-01-01
      相关资源
      最近更新 更多