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

관련 정보