【问题标题】:grep on zipped files without zgrep对没有 zgrep 的压缩文件进行 grep
【发布时间】:2018-02-20 15:31:29
【问题描述】:

我需要对一组文件(一些压缩文件,一些没有压缩文件)进行 grep 处理以获取特定模式。我知道 zgrep 可用于对压缩文件进行 grep,但正在运行的脚本依赖于具有不同逻辑的返回代码,用于返回代码 0、1 和其他任何内容。

grep 状态: 如果找到选定的行,则退出状态为 0,否则为 1。 2 如果发生错误。

zgrep 表示它的工作方式与 grep 相同,但可以处理压缩文件。

但是有 2 个文件:

#test1
hello

#test2
goodbye

都在同一个目录中

grep "hello" * 按预期返回 0,因为该模式在 test1 中找到

zgrep "hello" * 但是即使在 test1 中找到该模式,也会返回 1。它返回 1,因为在 test2 中找不到该模式。结果是,如果任何文件不匹配该模式,则返回 1,即使所有其他文件都匹配该模式。

就我而言,我只关心是否至少有 1 个文件匹配或没有文件匹配。如果有人这样做,有人不这样做,那应该算是成功。

那么有什么方法我可以在没有 zgrep 的情况下对压缩和解压缩的文件进行 grep 并获得正确的返回码,因为 zgrep 似乎有问题?

grep 版本:2.20

zgrep 版本:1.5

注意:如果没有长达数月的审批流程,我甚至系统管理员都无法更改这些版本号,因此请避免使用“更新您的东西”之类的解决方案

【问题讨论】:

  • 你可以试试zipgrep。它依赖于egrepunzip,因此它应该具有与egrep 相同的返回值。
  • @Aserre zipgrep 不幸的是仅适用于压缩文件,无法处理未压缩的文件。我需要一个可以同时处理的解决方案
  • 请注意,this bug was fixed back in 2006。但是,您需要将您的东西“升级”到 gzip 的 1.3.5-14 版:/
  • 另一种选择是为zgrep 使用-l 标志,如我之前评论中的错误报告所示
  • @Aserre:使用 zgrep --version; zgrep (gzip) 1.6; Copyright (C) 2010-2013 Free Software Foundation, Inc. 显示相同的行为。

标签: bash grep


【解决方案1】:

这似乎是zgrep 中的一个错误。试试xzgrep

$ xzgrep -q hello *; echo $?
0
$ zgrep -q hello *;echo $?
1
$ grep -q hello *;echo $?
0

如果文件始终为gzipped,您也可以同时使用zcatgrep

$ zcat * | grep -q hello; echo $?

【讨论】:

    【解决方案2】:
    zgrep -m1 -c "a23215" /var/log/syslog.*.gz | egrep -v ":0$" && echo hit || echo miss
    

    向我显示“想念”,

    zgrep -m1 -c "23215" /var/log/syslog.*.gz | egrep -v ":0$" && echo hit || echo miss
    

    虽然这显示“命中”,但 7 个文件中有 2 个匹配。

    更笼统的:

    zgrep -m1 -c "PATTERN" /path/FILEPATTERN* | egrep -q -v ":0$" && echo 1 || echo 0
    

    将只返回 0 或 1,没有匹配的文件名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-10
      • 2021-11-18
      • 1970-01-01
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多