ファイルを含む文字列は(.gz)圧縮フォルダーで検索する必要があります。
サンプルフォルダ -
PROD_009_010919_0110.tar.gz
内部ファイル - PROD_009_010919.log01, PROD_009_010919.log02, PROD_009_010919.log03
...など。
コマンド -zgrep -ia *123456* PROD_*
予期した結果が出ません。
期待される出力 - 圧縮フォルダ内のすべてのファイルから文字列 "123456"を検索し、ファイルを含む文字列を表示する必要があります。
答え1
これは、与えられたパターンに一致するtarballのファイルのリストを印刷します。
tar --ignore-command-error -xvf PROD_009_010919_0110.tar.gz --to-command="grep -FH 1234536 -" | grep -B1 --no-group-separator '(standard input)' | grep -v '(standard input)'
この--to-command
オプションは各ファイルを抽出してコマンドの標準入力に送信しますgrep
。この-v
オプションは、各ファイルの処理をリストします。
一致するものがない場合は、終了ステータスを無視するために使用されます--ignore-command-error
。コマンドは(印刷ファイル名)オプションを使用するため、一致grep
する各行には「(標準入力)」文字列が接頭辞で付けられます。 -H
grep
これにより、コマンドは次の種類の出力を生成しますtar
。
file1
file2
(standard input): <matched lines from file2>
file3
(standard input): <matched lines from file3>
この出力をパイピングすると、両方のコマンドはgrep
次の行の「(標準入力)」文字列の後に続くファイル名のみを抽出できます。grep
ここで使用した2つの順次コマンドの代わりに正規表現を使用してパターンを一致させることで、この処理を改善できます。
この場合、結果の出力は次のようになります。
file2
file3