grep最后n个跨文件匹配

时间:2012-01-25 23:14:34

标签: shell grep

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

grep somestring * .log

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

4 个答案:

答案 0 :(得分:7)

我认为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。

答案 1 :(得分:1)

在这里摆脱袖口,但请阅读此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

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

答案 2 :(得分:1)

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可以是您的行数

答案 3 :(得分:0)

当前目录下每个日志文件中

最后出现搜索模式

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"

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

或者,您可以使用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"