我正在尝试使用grep浏览一些日志,只选择最新的条目。这些日志拥有多年的繁忙交通,所以这很愚蠢
tac error.log | grep 2012
tac error.log | grep "Jan.2012"
等
等待10分钟,然后经过数百万行我已经知道不会匹配。我知道在第一场比赛中有-m
选项停止,但我不知道如何让它在第一场比赛时停止。我可以做grep -B MAX_INT -m 1 2011
这样的事情,但这不是最佳解决方案。
grep可以处理这个或者会更有意义吗?
答案 0 :(得分:5)
如何使用awk
这样:
tac error.log | awk '{if(/2012/)print;else exit}'
一旦找到与2012不匹配的行,就应该退出。
答案 1 :(得分:2)
这是python中的解决方案:
# foo.py
import sys, re
for line in sys.stdin:
if re.match(r'2012', line):
print line,
continue
break
在@宿主GT; tac foo.txt | python foo.py
答案 2 :(得分:1)
我认为grep
不支持此。
但这是我的“为什么我们再次awk
”回答:
tail -n `tac biglogfile | grep -vnm1 2012 | sed 's/:.*//' | xargs expr -1 +` biglogfile
请注意,如果您的日志正在写入,则情况并不准确。
答案 3 :(得分:1)
救援的优秀one-line scripts for sed
页:
# print section of file between two regular expressions (inclusive)
sed -n '/Iowa/,/Montana/p' # case sensitive
换句话说,您应该能够执行以下操作:
sed -n '/Jan 01 2012/,/Feb 01 2012/p' error.log | grep whatevs