Grep

grep vs zgrep 與多個文件的退出狀態差異

  • September 5, 2019

設置

echo "abc" >/tmp/foo1
echo "def" >/tmp/foo2
cp /tmp/foo1 /tmp/gzfoo1
cp /tmp/foo2 /tmp/gzfoo2
gzip /tmp/gzfoo*

grep 退出狀態與多個文件和一個匹配是 0

grep -q abc /tmp/foo[12]
echo $?
0

zgrep 退出狀態與多個解壓縮文件和一個匹配是 1

zgrep -q abc /tmp/foo[12]
echo $?
1

zgrep 退出狀態與多個壓縮文件和一個匹配是 1

zgrep -q abc /tmp/gzfoo[12].gz
echo $?
1

我確實看到 zgrep 是一個 shell 腳本。如果任何grep 返回非零,zgrep 似乎也返回非零。這是我從 zgrep 中轉述的摘錄:

res=0
for input_file
do
 # ... run grep on input_file ...
 r=$?
 ...
 test $res -lt $r && res=$r
done
exit $res

zgrep 版本是(古老的)1.3.12:

$ zgrep --version
zgrep (gzip) 1.3.12
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software.  You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.

Written by Jean-loup Gailly.

zgrep (gzip) 1.6 也會發生:

$ /&lt;other_zgrep_path/bin/zgrep --version
zgrep (gzip) 1.6
Copyright (C) 2010-2013 Free Software Foundation, Inc.
This is free software.  You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.

Written by Jean-loup Gailly.

$ /&lt;other_zgrep_path/bin/zgrep -q abc /tmp/gzfoo[12].gz
$ echo $? 
1

問題:zgrep 中是否存在錯誤?它應該被修復嗎?

編輯:找到一台帶有 zgrep/gzip 1.8 的較新機器,它沒有這個問題。所以,看起來我的機器很舊。這是它在新機器上的樣子:

: zgrep --version
zgrep (gzip) 1.8
Copyright (C) 2010-2016 Free Software Foundation, Inc.
This is free software.  You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.

Written by Jean-loup Gailly.

: zgrep -q abc /tmp/foo[12]
: echo $?
0

避免舊的/錯誤的 zgrep 的解決方法:

: ( gzcat -f /tmp/foo[12] | grep -q abc ) &gt;&/dev/null 
: echo $?
0

您可以從 https://savannah.gnu.org/git/?group=gzip獲取原始碼。返回程式碼在 commit 中更改d2a1928e5534017456dc8a3b600ba0b30cce4a6e

commit d2a1928e5534017456dc8a3b600ba0b30cce4a6e
Author: Paul Eggert &lt;eggert@cs.ucla.edu&gt;
Date:   Thu Jun 12 18:43:08 2014 -0700

   zgrep: exit with status 0 if a file matches and there's no trouble

   Reported by Pavel Raiskup in: http://bugs.gnu.org/17760
   * zgrep.in (res): Treat exit status 0 to be greater than 1.
   Also, exit immediately on software configuration error.

送出消息包含錯誤報告的連結: https ://debbugs.gnu.org/cgi/bugreport.cgi?bug=17760

您可以自己輕鬆檢查。從zgrep上述送出建構:

$ /media/data/gzip-install-newer/bin/zgrep --version
zgrep (gzip) 1.6.17-d2a1
Copyright (C) 2010-2014 Free Software Foundation, Inc.
This is free software.  You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.

Written by Jean-loup Gailly.
$ /media/data/gzip-install-newer/bin/zgrep -q abc /tmp/foo[12]
$ echo $?
0

zgrep上一個送出建構:

$ /media/data/gzip-install/bin/zgrep --version
zgrep (gzip) 1.6.16-ed8c
Copyright (C) 2010-2014 Free Software Foundation, Inc.
This is free software.  You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.

Written by Jean-loup Gailly.
$ /media/data/gzip-install/bin/zgrep -q abc /tmp/foo[12]
$ echo $?
1

引用自:https://unix.stackexchange.com/questions/539255