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

관련 정보