2017-02-05 12 views
0

我在Linux中的一个特定目录中的大约50个.gz文件。我需要在每个文件中找到一个特定的行。目前我正在通过zcat每个文件做。在.gz文件列表中找到一行

例如:

zcat 20160909-custfw.log.7.gz | zgrep BGP | zgrep 145.247.1.62 

输出:

09月09日17点12分47秒145.247.1.62帽-S12-custfw-1:的NetScreen DEVICE_ID =帽-S12-custfw-1 [根]系统信息-00542:BGP对等 10.24.224.187变为空闲状态(2016年9月9日17时13分15秒)

请让我,如果有任何更简单的方法 做这个。

+0

我很惊讶,以上实际工作。 zcat解压缩整个事物并将所有内容打印到标准输出。这里绝对没有任何理由,你正在浪费很多CPU周期。 – GhostCat

+0

此外。这个网站是关于编程问题。例如,你的问题宁愿去unix.stackexchange.com。 – GhostCat

回答

0

搜索它们并联GNU并行

parallel zgrep BGP {} ::: *.gz | grep 145.247.1.62 

如果你知道它只是在每个文件中出现一次,或者只在第一次出现有兴趣,使用zgrep -m1以免打扰读取文件的剩余部分,并停止在第一场比赛。

+0

谢谢,这正是我正在寻找,我想检查第一次出现。 – user7315541

2

如果您已安装zgrep,则不应该有zcat该文件。 zgrep的全部要点是让你直接grep gzip文件。因此,你应该仅仅是能够做到这一点:

zgrep BGP *.gz | grep 145.247.1.62 

这应该是稍微更高性能的为好。

1

zgrep 'BGP.*145.247.1.62' $dir/*.gz怎么样?

(或者达到相同的结果你两个zgrep调用的顺序,你就必须也zgrep两个正则表达式的逆顺序,某事像zgrep 'BGP.*145.247.1.62\|145.247.1.62.*BGP' $dir/*.gz