【问题标题】:Find a line in a list of .gz files在 .gz 文件列表中查找一行
【发布时间】:2017-06-22 17:26:09
【问题描述】:

我在 linux 的特定目录中有大约 50 个 .gz 文件。我需要在每个文件中找到一个特定的行。目前我正在通过 zcat 每个文件进行操作。

例如:

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

输出:

9 月 9 日 17:12:47 145.247.1.62 cap-s12-custfw-1:NetScreen device_id=cap-s12-custfw-1 [根]system-information-00542:BGP 对等体 10.24.224.187 变为空闲状态 (2016-09-09 17:13:15)

如果有更简单的方法,请告诉我。

【问题讨论】:

  • 我很惊讶上述方法确实有效。 zcat 解压缩整个内容并将所有内容打印到标准输出。您在这里毫无理由地浪费了很多 CPU 周期。
  • 此外。这个网站是关于编程问题的。例如,您的问题宁愿去 unix.stackexchange.com。

标签: linux shell zcat


【解决方案1】:

如果您已经安装了zgrep,则不必zcat 文件。 zgrep 的全部意义在于让您直接 grep gzip 文件。因此,您应该能够做到这一点:

zgrep BGP *.gz | grep 145.247.1.62

这也应该稍微提高性能。

【讨论】:

    【解决方案2】:

    zgrep 'BGP.*145.247.1.62' $dir/*.gz 呢?

    (或者要获得与您的两个zgrep 调用序列等效的结果,您还必须zgrep 两个正则表达式的逆序,例如zgrep 'BGP.*145.247.1.62\|145.247.1.62.*BGP' $dir/*.gz。)

    【讨论】:

      【解决方案3】:

      使用 GNU Parallel 并行搜索它们:

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

      如果您知道它在每个文件中只出现一次,或者只对第一次出现感兴趣,请使用 zgrep -m1 避免阅读文件的其余部分并在第一次匹配时停止。

      【讨论】:

      • 谢谢,这正是我要找的,我想检查第一次出现。
      猜你喜欢
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      • 2019-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多