awk/sed/grep을 사용하여 콘텐츠별로 많은 파일을 효율적으로 필터링

awk/sed/grep을 사용하여 콘텐츠별로 많은 파일을 효율적으로 필터링

두 번째 줄이 특정 정규식과 정확히 일치하는 디렉터리의 모든 파일을 (재귀적으로) 나열하고 싶습니다. 총 파일 수는 약 60K입니다.

지금까지 나는 다음 명령을 작성했습니다: find /path -type f | xargs --no-run-if-empty -n1000 awk 'FNR = 2 && $0 ~ /^regular expression$/ {print FILENAME; nextfile}'.

효율성이 향상될 수 있나요?

답변1

=먼저 올바르게 사용하는 대신 잘못 사용하고 있음을 알아두십시오 ==.

그럴 필요는 없습니다 xargs. 그냥 실행하면 됩니다 find. 또한 awk전체 파일을 읽는 것이 아니라 2행을 처리한 후 즉시 종료해야 합니다.

find /path -type f -exec awk 'FNR == 2 && /^regular expression$/ {print FILENAME}; FNR == 2 {nextfile}' '{}' +

인수 +끝에 있는 -exec지시문은 find가능한 한 많은 파일 이름 인수를 배치합니다. 라 라 xargs. 바라보다find문서.

여기서 중요한 점은 입니다 FNR==2 {nextfile}.

(그러나 가능한 경우 &를 사용하는 -exec것보다) 더 나은지 여부는 논쟁의 여지가 있습니다. 한편으로는 이전 배치를 확인하는 동안 더 많은 파일 이름을 읽을 수 있도록 허용함으로써 어느 정도의 병렬 처리가 달성됩니다 . 반면에 병렬화로 인해 불량 디스크가 디스크 의 다른 트랙과 경쟁하게 될 수 있습니다. 하드웨어(캐시 크기, SSD 등)에 따라 이 내용이 변경됩니다. 그런 다음 프로필이 결정합니다.xargs-print0-0find … | xargs …findawkawkfind

답변2

당신은 시도 할 수 있습니다:

grep -n <reg expr> /path/to/* | grep ":2:" | cut -d ':' -f1

:2:그것의 일부가 아닌 한 <reg expr>.

-x전체 라인 일치도 있습니다 .

이것이 더 빠른지는 확실하지 않습니다. 테스트할 파일이 60,000개가 없습니다.]

관련 정보