【问题标题】:Grep only last line after find needed files仅在找到所需文件后的最后一行 Grep
【发布时间】:2014-03-14 12:57:39
【问题描述】:

大家好,我有一个来自this thread的扩展问题

我需要找到一些给定文件名的文件,并在这些文件的最后几行使用 grep 来查找某个字符串。

我目前有:

find my_dir/ -name "*filename*" | xargs grep 'lookingfor'

我是使用这些命令的新手,我将不胜感激。提前谢谢你。

【问题讨论】:

    标签: bash search grep find


    【解决方案1】:

    例如,您可以这样做:

    find my_dir/ -name "*filename*" -exec sh -c "tail -200 {} | grep lookingfor" \;
    

    200 设置为您想要的最后一行数。

    【讨论】:

    • 这样他会丢失文件名
    • @user3159253 他可以将-H 标志添加到grep 来解决这个问题
    • 不,他不能。 tail 吃掉文件名,而 grep 仅在 STDIN 上工作
    • 你其实可以试试:tail /path/to/file | grep -H lookingfor给我(standard input):lookingfor
    • @user3159253 不错,为您的回答 +1。
    【解决方案2】:

    我会选择

    find  my_dir -name '*filename*' -type f \
         -exec /bin/bash -c '(tail -5 "$1" | grep -q lookingfor) && echo "$1"' _ {} \;
    

    这样您将正确处理所有(好吧,希望是所有:-))文件名,甚至那些带有 " 和其他奇怪符号的文件名。另外我建议显式调用 /bin/bash 因为 /bin/sh 可能被链接到像 ashsashdash 这样的残缺 sh 变体。

    【讨论】:

    • 另外,我似乎刚刚在 bash 中发现了一个错误/一个奇怪的行为:bash -c 'echo \$@=\"$@\";' a b c 给了我$@="b c" :-)。这就是为什么我在命令参数{}之间需要一个额外的_
    【解决方案3】:

    使用 find + awk + ​​wc -l

    find  my_dir -name '*filename*' -type f -exec awk 'NR>count-100{print FILENAME, $0}' count=$(wc -l < {}) {} +
    

    将 100 调整为您想要的最后一行数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-09
      • 2019-09-08
      • 2012-02-11
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 2018-09-21
      • 1970-01-01
      相关资源
      最近更新 更多