在 .gz 文件列表中查找一行
Find a line in a list of .gz files
我在 linux 的特定目录中有大约 50 个 .gz 文件。我需要在每个文件中找到特定的行。目前我正在通过 zcat 处理每个文件。
例如:
zcat 20160909-custfw.log.7.gz | zgrep BGP | zgrep 145.247.1.62
输出:
Sep 9 17:12:47 145.247.1.62 cap-s12-custfw-1: NetScreen
device_id=cap-s12-custfw-1 [Root]system-information-00542: BGP peer
10.24.224.187 changed to Idle state (2016-09-09 17:13:15)
如果有更简单的方法,请告诉我。
如果您已经安装了 zgrep
,则不必 zcat
该文件。 zgrep 的全部意义在于让您直接 grep gzip 文件。因此,您应该能够做到这一点:
zgrep BGP *.gz | grep 145.247.1.62
这也应该更高效。
zgrep 'BGP.*145.247.1.62' $dir/*.gz
呢?
(或者为了获得与两个 zgrep
调用序列相同的结果,您还必须 zgrep 两个正则表达式的逆序,例如 zgrep 'BGP.*145.247.1.62\|145.247.1.62.*BGP' $dir/*.gz
。)
使用 GNU Parallel 并行搜索:
parallel zgrep BGP {} ::: *.gz | grep 145.247.1.62
如果您知道它在每个文件中只出现一次,或者只对第一次出现感兴趣,请使用 zgrep -m1
以避免阅读文件的其余部分并在第一次匹配时停止。
我在 linux 的特定目录中有大约 50 个 .gz 文件。我需要在每个文件中找到特定的行。目前我正在通过 zcat 处理每个文件。
例如:
zcat 20160909-custfw.log.7.gz | zgrep BGP | zgrep 145.247.1.62
输出:
Sep 9 17:12:47 145.247.1.62 cap-s12-custfw-1: NetScreen device_id=cap-s12-custfw-1 [Root]system-information-00542: BGP peer 10.24.224.187 changed to Idle state (2016-09-09 17:13:15)
如果有更简单的方法,请告诉我。
如果您已经安装了 zgrep
,则不必 zcat
该文件。 zgrep 的全部意义在于让您直接 grep gzip 文件。因此,您应该能够做到这一点:
zgrep BGP *.gz | grep 145.247.1.62
这也应该更高效。
zgrep 'BGP.*145.247.1.62' $dir/*.gz
呢?
(或者为了获得与两个 zgrep
调用序列相同的结果,您还必须 zgrep 两个正则表达式的逆序,例如 zgrep 'BGP.*145.247.1.62\|145.247.1.62.*BGP' $dir/*.gz
。)
使用 GNU Parallel 并行搜索:
parallel zgrep BGP {} ::: *.gz | grep 145.247.1.62
如果您知道它在每个文件中只出现一次,或者只对第一次出现感兴趣,请使用 zgrep -m1
以避免阅读文件的其余部分并在第一次匹配时停止。