![特定のファイルとパターンのアーカイブ検索[重複]](https://linux33.com/image/71737/%E7%89%B9%E5%AE%9A%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A8%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%AE%E3%82%A2%E3%83%BC%E3%82%AB%E3%82%A4%E3%83%96%E6%A4%9C%E7%B4%A2%5B%E9%87%8D%E8%A4%87%5D.png)
複数のアーカイブで正規表現を使用して、そのアーカイブに含まれるファイル名とそのファイルの内容を見つけることは可能ですか?どのアーカイブにパターンが一致するかを知りたいです。可能であればOS Xを使用しています。
答え1
より表現力豊かなスタイルファイルモードを使用する必要がある場合grep
:
tar -OT <(tar -tf /path/to/file.tar | grep 'FILE_PATTERN') -xf /path/to/file.tar \
| grep 'CONTENT_PATTERN'
-O
とともに使用する場合は、次の出力を指定し、stdout
抽出する名前を含むファイルを指定します。-T
-x
もっと簡単だったらパス名拡張<( ... )
()をより単純な改行プロセスに置き換えることができれば十分です。これにより、echo
ファイルで2回読み取る必要がなくなります。tar
tar -OT <(echo 'FILE_PATTERN') -xf /path/to/file.tar \
| grep 'CONTENT_PATTERN'
ファイル名も表示するには、対応する-v
フラグを追加してください(私は個人的に選択します)。ただし、ファイル名を取得するにはgrepを再変更する-xvf
必要があります。私はこれを読者に練習として残します...CONTENT_PATTERN
少しトリッキーになり、より多くの出力処理を使用する必要がありますawk
...一致するファイル名が1行に表示されるため、残念ながら、ここには明確な区切り文字はありません。ファイル名が内容として繰り返されないとします。:
tar ... | awk '/^FILLE_AWK_PATTERN$/{f=$0;next}...'
これにより、awk
変数がf
見つかったそれぞれの新しいファイル名に設定されます。そして次の行にジャンプ。次に、
tar ... | awk '...$f&&/CONTENT_AWK_PATTERN/{print $f;$f=""}'
一致する行が表示されたら印刷します。$f
ファイル名をリセットしてください。次のファイルが「会う」まで。
総合してみると:
tar -OT <(echo 'FILE_PATTERN') -xf /path/to/file.tar \
| awk '/^FILLE_AWK_PATTERN$/{f=$0;next};$f&&/CONTENT_AWK_PATTERN/{print $f;$f=""}'