【问题标题】:Use grep command but only for the last lines of a file?使用 grep 命令但仅用于文件的最后几行?
【发布时间】:2019-09-08 01:46:26
【问题描述】:

如何仅对文件的“尾部”执行 grep?

我正在尝试运行此命令:

grep 'TEST COMPLETE' -L *.log

TEST COMPLETE 出现在最后几行,此命令列出文件夹中尚未完成测试的所有文件(因为-L)。日志很大,所以grep 很慢。

另一方面,我可以在尾部使用 grep 管道。 grep 几乎是即时的:

tail *.log | grep 'TEST COMPLETE'

但是我不能使用 -l-L 参数,因为我现在正在 grepping 管道输入而不是文件。所以使用列表文件参数运行它:

tail *.log | grep 'TEST COMPLETE' -L

只会输出:(standard input)

有什么方法可以让grep 搜索最后 10 行或类似的内容吗?

【问题讨论】:

  • 您是否真的像我们都假设的那样一次在多个日志文件上运行 tail,或者您实际上只是在 1 个日志文件上运行它,但使用 *.log 来避免为文件编造名称?
  • 是的。在太多文件上运行它,无法手动筛选。如果它只是一个文件,我不需要这个命令,因为我可以执行tail file.log 并查看它是否完整。

标签: bash shell grep tail


【解决方案1】:

tail -n10 FILENAME 会给你文件的最后 10 行。然后,您可以按照您的问题将其通过管道传输到 grep 中。

【讨论】:

  • OP 知道这一点。问题是如何使它与grep -L 一起工作(注意-L)。
【解决方案2】:

这应该可行:

for f in *.log; do  tail "$f" | grep -q 'TEST COMPLETE' || echo "$f"; done

【讨论】:

  • 我不是投反对票的人,但我猜这是因为你的逻辑颠倒了。 OP 想要打印出 包含TEST COMPLETE 的文件的名称。但是,是的,如果您将&& 更改为||,并引用$f,您的答案与我的基本相同。这应该是评论,而不是投反对票。
【解决方案3】:

您可以在 for 循环中执行此操作:

for log in *.log; do
   if ! tail "$log" | grep -q 'TEST COMPLETE'; then
      echo "$log"
   fi
done

【讨论】:

  • 这行,谢谢!引用变量有什么目的吗?
  • 在该引用问题中接受的答案具有倒退的思维过程 - 引号不是您在需要时添加的东西,它们是您删除的东西 当你需要的时候。除非您需要使用双引号(例如让变量扩展)或需要不使用引号(例如进行通配和文件操作),否则始终将字符串和脚本用单引号括起来名称扩展)。 @tripleee's answer 这个问题更好,但另见mywiki.wooledge.org/Quotes
【解决方案4】:

假设tail *.log 在每个文件之间放置==> filename <==,并且该字符串不会出现在任何文件中:

tail *.log |
awk 'gsub(/^==> | <==$/,""){if (f) print f; f=""} /TEST COMPLETE/{f=FILENAME} END{if (f) print f}'

【讨论】:

    猜你喜欢
    • 2018-10-30
    • 2013-04-18
    • 2020-08-30
    • 2014-03-14
    • 1970-01-01
    • 2021-10-30
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多