처음 10줄만 스캔하도록 grep을 제한하는 방법은 무엇입니까?

처음 10줄만 스캔하도록 grep을 제한하는 방법은 무엇입니까?

foo줄로 구분된 파일 목록을 출력하는 명령을 받았습니다 \n.

다음 명령을 사용하여 파일의 정규식 내용을 기준으로 결과를 필터링했습니다.

foo | xargs grep -l regex

문제는 일부 파일이 매우 커서 내가 찾고 있는 내용이 처음 10줄에서만 발견된다는 것입니다. 실행 속도를 높이기 위해 grep에게 처음 10줄만 처리하도록 어떻게 지시합니까?

답변1

의견에 따르면 문제의 절반이 해결되었습니다.

foo | xargs grep -m 1 regex

나머지 문제를 해결하려면 더 많은 스크립팅이 필요합니다.

foo | xargs sh -c 'for file; do head "$file"; done | grep regex' sh

그러나 grep이 스트림을 읽고 있기 때문에 이것은 파일 이름을 제공하지 않습니다.

GNU awk가 있는 경우:

foo | xargs gawk -v pattern='regex' -v lines=10 -v OFS=':' '
  $0 ~ pattern {print FILENAME, FNR, $0}
  FNR == lines {nextfile}
'

파일 이름만 가져오기

  $0 ~ pattern {print FILENAME; nextfile}

답변2

for i in $(foo); do echo -e "$i \c"; head -n10 $i | grep -c regex; done

foo스크립트에서 파일 이름과 숫자가 차례로 인쇄됩니다 . 숫자가 0이면 일치 항목이 없으며 regex결과에서 이러한 0 항목은 필요하지 않은 경우 쉽게 필터링할 수 있습니다.

답변3

수정된 버전글렌 잭맨의 답변출력 파일 이름:

foo | xargs sh -c 'for file; do head "$file" | grep -l --label="$file" regex; done' sh

관련 정보