Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使grep在第一个不匹配行之后停止_Bash_Grep - Fatal编程技术网

Bash 使grep在第一个不匹配行之后停止

Bash 使grep在第一个不匹配行之后停止,bash,grep,Bash,Grep,我试图使用grep浏览一些日志,只选择最近的条目。这些圆木上有多年的流量,所以这样做很愚蠢 tac error.log | grep 2012 tac error.log | grep "Jan.2012" 等等 然后等10分钟,让它穿过几百万条线,我已经知道这些线是不匹配的。我知道有-m选项可以在第一场比赛时停止,但我不知道如何让它在第一场非比赛时停止。我可以做一些类似于grep-bmax_INT-m12011的事情,但这并不是一个最佳的解决方案 grep能处理这个问题吗,

我试图使用grep浏览一些日志,只选择最近的条目。这些圆木上有多年的流量,所以这样做很愚蠢

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

然后等10分钟,让它穿过几百万条线,我已经知道这些线是不匹配的。我知道有
-m
选项可以在第一场比赛时停止,但我不知道如何让它在第一场非比赛时停止。我可以做一些类似于grep-bmax_INT-m12011的事情,但这并不是一个最佳的解决方案


grep能处理这个问题吗,或者awk更有意义吗?

像这样使用
awk
怎么样:

tac error.log | awk '{if(/2012/)print;else exit}'

一旦发现与2012不匹配的行,应该立即退出。

我认为
grep
不支持此操作

但以下是我的“为什么我们又有了
awk
”答案:


请注意,如果您的日志正在写入,则这将不准确。

这里有一个python解决方案:

# foo.py
import sys, re
for line in sys.stdin:
    if re.match(r'2012', line):
        print line,
        continue
    break
you@host>tac foo.txt | python foo.py

拯救的优秀页面:

# 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

如果你愿意对此有点特别,你可以尝试“tail-nn”在通过grep管道传输之前提取最近的n行,以消除今年的任何not。我会使用awk或(实际上)perl-为什么不呢?为什么你允许日志文件增长得这么大?听起来你需要了解日志轮换。你的第一句话与文章的其余部分不匹配:如果你真的只想要“最近的条目”,你就不需要停止搜索。实际上,没有任何方法可以让
grep
或任何其他程序可靠地跳过正确数量的行,而不读取它们或不知道需要跳过多少字节。@l0b0问题是,前K行都与已知模式(时间戳)匹配,而剩余的N-K行则不匹配。显然,我必须解析前K行,剩下的N-K是我不想处理的。很好的链接,但这不会贯穿整个文件吗?是的,但取决于你能使正则表达式的长度和精度,它可能非常快。它几乎不会比使用
grep
@tripleee进行的相同搜索快:显然,只有在第一行
2012年2月1日
之后有数据时,它才会更快,但这是基于原始问题的假设。Cat的无用使用。只需使用
python foo.py foo.txt
。我想他指的是
tac foo.txt | python foo.py
@triplee这个(python foo.py foo.txt)不起作用,因为代码段是从stdin读取的。那么避免无用Cat的正确方法是
python foo.py你能解释一下sed和xargs部分吗?剩下的我都明白了。另外,我不认为问题的措辞意味着任何解决方案都必须包括grep,这就是我的出发点。只需逐段尝试,看看这些部分是为了什么。。。但是OK:
grep-n
打印带有匹配行的行号,
sed
只保留行号,
xargs expr
将其减少1。
sed -n '/Jan 01 2012/,/Feb 01 2012/p' error.log | grep whatevs