web-dev-qa-db-ja.com

GNUとBSDzgrepの出力の違い

Zgrepを使用してパターンを検索し、複数の.gzファイルから一致した行の後にN行を出力しています。

BSD zgrepでは、各ファイルの後に区切り文字--が表示されます。

zgrep (BSD grep) 2.5.1-FreeBSD
$ zgrep  "match string" -A 1 FileName1.log.gz FileName2.log.gz
FileName1.log.gz:match string
FileName1.log.gz-
--
FileName2.log.gz:match string
FileName2.log.gz-

しかし、GNUでは同じようには見えません:

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.

# zgrep  "match string" -A 1 FileName1.log.gz FileName2.log.gz
FileName1.log.gz:match string
FileName1.log.gz:
FileName2.log.gz:match string
FileName2.log.gz:

--group-separatorを試しましたが、単一ファイル内の一致を区切るようです。

GNU zgrepで同様の結果を得るにはどうすればよいですか?

4
BabaYaga

GNU zgrep(またはOpenBSD zgrep、さらに言えば、zgrepに特有のようです)で同様の出力を取得することはできません。 FreeBSDとmacOS)。結果を独自に後処理しない限り、簡単ではありません。

$ zgrep hello file*.gz | awk -F : 'NR > 1 && $1 != name { print "--" } { name = $1; print }'
file1.gz:hello world
--
file2.gz:hello world
--
file3.gz:hello world
--
file4.gz:hello world
--
file5.gz:hello world

これにより、zgrepの出力が短いawkプログラムに渡され、行のファイル名ビット(最初の:の前のビット)が変更されるたびにセパレータが挿入されます。

1
Kusalananda