在第一个非匹配线后使grep停止

时间:2012-01-20 11:23:00

标签: bash grep

我正在尝试使用grep浏览一些日志,只选择最新的条目。这些日志拥有多年的繁忙交通,所以这很愚蠢

    tac error.log | grep 2012
    tac error.log | grep "Jan.2012" 

等待10分钟,然后经过数百万行我已经知道不会匹配。我知道在第一场比赛中有-m选项停止,但我不知道如何让它在第一场比赛时停止。我可以做grep -B MAX_INT -m 1 2011这样的事情,但这不是最佳解决方案。

grep可以处理这个或者会更有意义吗?

4 个答案:

答案 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