
나는 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
파일 이름과 같은 이스케이프 시퀀스가 없다고 가정합니다.