末尾の行を生成せずに「grep -a」する方法は?

末尾の行を生成せずに「grep -a」する方法は?

私はzgreptarballファイルから文字列を取得するために使用します。一般的な方法で行うと、次のような結果が得られます。

aaa.tar.gz内のzgrep

Binary file (standard input) matches

だから私はそのオプションを使って-a(バイナリファイルをテキストのように扱い)、ファイルを読みましたが、結果の前に2/3行の迷惑行を追加しました!

aaa.tar.gzのzgrep -a

aaa.txt        0000777 0000000 0000000 00000000017 13507572577 011066  0 ustar   root     
root
insideinsidebbb  

どのように効果的に削除できますか?

ベストアンサー1

GNUを使用すると、tarこの--to-commandオプションを使用して各アーカイブメンバーにパイプすることgrepができます(GNUgrepとその--labelオプションを使用して)、一致を含む埋め込みファイルの名前も取得できます。

$ tar --to-command='grep -aH --label="$TAR_ARCHIVE[$TAR_FILENAME]" inside || true' -xf awk.tar.gz
awk.tar.gz[ytab.c]:                             SYNTAX("next is illegal inside a function");
awk.tar.gz[ytab.c]:                             SYNTAX("nextfile is illegal inside a function");
awk.tar.gz[awkgram.y]:                          SYNTAX("next is illegal inside a function");
awk.tar.gz[awkgram.y]:                          SYNTAX("nextfile is illegal inside a function");
awk.tar.gz[lex.c]:/* BUG: this ought to be inside the if; in theory could fault (daniel barrett) */
awk.tar.gz[ytabc.bak]:                          SYNTAX("next is illegal inside a function");
awk.tar.gz[ytabc.bak]:                          SYNTAX("nextfile is illegal inside a function");

これは|| true、アーカイブメンバーに何も見つからないtar: 2631: Child returned status 1場合に警告を防ぐためです。grep

targrep次のヘルパー関数またはスクリプトを作成できます。

#! /bin/sh -
export PATTERN="${1?}"
shift
for file do
  tar --to-command='
    grep -aPH --label="$TAR_ARCHIVE[$TAR_FILENAME]" -e "$PATTERN" || true
  ' -xf "$file"
done

次のように使用されます。

targrep inside *.tar.*

これは、GNUがサポートする最も完全な機能を備えた正規表現であるPCREを使用するため、tar大文字と小文字を区別しない一致を実行できます。たとえば、次のようになります。

targrep '(?i)inside' *.tar.*

(オプションをサポートするためにスクリプトでより複雑なオプションの解析を避ける-i

おすすめ記事