我正在使用grep来提取一组文件中的行:
grep somestring * .log
是否可以将每个文件的最大匹配数限制为每个文件的最后n个匹配?
答案 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" \;
您可以-mtime
与find
一起使用来限制搜索日志文件,让我们说5天
find . -mtime -5 -name \*log\* | xargs -I{} sh -c "grep --color=always -iH pattern {} | tail -n1"