列をzgrepし、一致するファイル名を印刷します。

列をzgrepし、一致するファイル名を印刷します。

Linuxシステムでは、何千ものgzip圧縮ファイル内の特定の列のパターンを一致させようとしており、一致に基づいてファイル名を印刷しようとしています。次のオプションは私には適していません。提案を教えてください。ありがとう

zgrep 12345 *|  awk -F"^" '{if($8==12345) print}' 
find . -type f |xargs zcat |  awk -F"^" '{if($8==12345) print}' 

答え1

最も明確でシンプルなIMHOは次のとおりです。

while IFS= read -r fname; do
    zcat "$fname" | awk -F'^' -v fname="$fname" '$8==12345{print fname, $0}'
done < <(find . -type f)

しかし、zgrepからファイル名を印刷してawkとして読むオプションもあります。この方法はより効率的です(:sが含まれていないファイル名に依存します)。

zgrep -H '12345' * |
awk -F'^' '{fname=$0; sub(/:.*/,"",fname); sub(/[^:]+:/,"")} $8==12345{print fname, $0}'

どちらのソリューションもファイル名に改行がないと仮定し、最初のソリューションはファイル名\tにエスケープシーケンスがないと仮定します。

関連情報