【发布时间】:2012-01-25 23:14:33
【问题描述】:
我正在使用 grep 在一组文件中提取行:
grep somestring *.log
是否可以将每个文件的最大匹配数限制为每个文件的最后 n 个匹配项?
【问题讨论】:
我正在使用 grep 在一组文件中提取行:
grep somestring *.log
是否可以将每个文件的最大匹配数限制为每个文件的最后 n 个匹配项?
【问题讨论】:
我认为 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?
grep pattern file | tail -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
可能不完全正确,我面前没有要检查的文件,但应该是一个起点。
【讨论】:
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 可以是你的行数
【讨论】:
上一次在当前目录下的每个日志文件中出现搜索模式:
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" \;
您可以使用 -mtime 和 find 将您的日志文件搜索限制为 5 天
find . -mtime -5 -name \*log\* | xargs -I{} sh -c "grep --color=always -iH pattern {} | tail -n1"
【讨论】: