【问题标题】:grep Last n Matches Across Filesgrep 跨文件的最后 n 个匹配项
【发布时间】:2012-01-25 23:14:33
【问题描述】:

我正在使用 grep 在一组文件中提取行:

grep somestring *.log

是否可以将每个文件的最大匹配数限制为每个文件的最后 n 个匹配项?

【问题讨论】:

    标签: shell grep


    【解决方案1】:

    我认为 grep 不支持从文件末尾限制 N 个匹配,所以这就是你必须做的

    ls *.log | while read fn; do grep -iH create "$fn" | tail -1; done
    

    tail -1 -1 替换为 N。(-H 选项是打印文件名,否则如果您是单个文件中的 grep 则不会打印它,这正是我们上面所做的)

    注意:上面的 soln 可以很好地处理带有空格的文件名。

    对于从文件开头开始的 N 个匹配项

    grep -i -m1 create *.log
    

    -m1 1 替换为 N。

    【讨论】:

    • 像这样使用ls 可能是一个非常糟糕的主意。这里是why?
    • @Jaypal '非常糟糕的主意' 如果上述情况下的日志文件是由已知来源创建的,那么过度设计解决方案是没有意义的。如果不是,那么我可以理解增加的复杂性。
    • grep pattern file | tail -1 可以
    【解决方案2】:

    这里有点离题,但请阅读此How to do something to every file in a directory using bash? 作为起点。这是我的看法,假设每个文件只有最后 20 个匹配项。

    for i in * 
    do
      if test -f "$i" 
      then
        grep somestring $i | tail -n 20
      fi
    done
    

    可能不完全正确,我面前没有要检查的文件,但应该是一个起点。

    【讨论】:

      【解决方案3】:
      for file in /path/to/logs/*.log 
      do 
         tail <(grep -H 'pattern' "$file")
      done
      

      这会将最后 10 个匹配项列为tail,默认情况下会列出最后 10 行。如果您希望获得不同的号码,那么以下内容会有所帮助 -

      for file in /path/to/logs/*.log 
      do 
         tail -n number <(grep -H 'pattern' "$file")
      done
      

      number 可以是你的行数

      【讨论】:

        【解决方案4】:

        上一次在当前目录下的每个日志文件中出现搜索模式

        find . -name \*log\* | xargs -I{} sh -c "grep --color=always -iH pattern {} | tail -n1"
        

        第一次在当前目录下的每个日志文件中出现搜索模式

        find . -name \*log\* | xargs -I{} sh -c "grep --color=always -iH pattern {} | head -n1"
        

        -n1 中的1 替换为您想要的出现次数


        您也可以使用find-exec 选项代替xargs

        find . -name \*log\* -exec sh -c "grep --color=always -iH pattern {} | tail -n1" \;
        

        您可以使用 -mtimefind 将您的日志文件搜索限制为 5 天

        find . -mtime -5 -name \*log\* | xargs -I{} sh -c "grep --color=always -iH pattern {} | tail -n1"

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-29
          • 2023-02-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多