디렉토리에서 각 파일의 처음 50 줄을 재귀 적으로 grep하는 방법은 무엇입니까?


10

디렉토리와 하위 디렉토리에있는 모든 파일의 처음 50 줄을 검색해야합니다.

이것은 재귀 부분을 수행하지만 각 파일의 처음 50 줄로 제한하는 방법은 무엇입니까?

grep -r "matching string here" .

이 파일 중 일부는 크기가 커서 처음 50 줄에서만 일치하기를 원합니다. 일부 파일에서 메가 바이트의 이진 데이터를 검색하지 않음으로써 프로세스 속도를 높이려고합니다.


일치하는 파일 만 알고 싶습니까, 아니면 일치하는 문자열 만 갖기를 원합니까, 아니면 일치하는 문자열을 파일 이름과 함께 원하십니까?
gniourf_gniourf

답변:


11
  • 일치하는 파일을 원할 경우 :

    find . -type f -exec bash -c 'grep -q "matching string here" < <(head -n 50 "$1")' _ {} \; -printf '%p\n'
    

    또는

    find . -type f -exec bash -c 'grep -q "matching string here" < <(head -n 50 "$1") && printf '%s\n' "$1"' _ {} \;
    
  • 일치하는 문자열 만 원하는 경우 :

    find . -type f -exec head -n 50 {} \; | grep "matching string here"
    

    또는 더 나은

    find . -type f -exec head -q -n 50 {} + | grep "matching string here"
    
  • 그리고 둘 다 원하는 경우 :

    find . -type f -exec bash -c 'mapfile -t a < <(head -n 50 "$1" | grep "matching string here"); printf "$1: %s\n" "${a[@]}"' _ {} \;
    

비고

  • 와 약간 쉬울 수 sed대신 콤보 head- grep.
  • 재미있는 기호 (공백, 줄 바꿈 등)를 포함 할 수있는 파일 이름과 관련하여 세 가지 방법 모두 100 % 안전하다고 강조하겠습니다.
  • 이 두 가지 방법에서 최근 버전의 bash가 있다고 가정합니다.
  • -exec ... +각 방법에서 사용할 수 있지만 내부 루프를 직접 코딩해야합니다! (사소한 운동은 독자에게 맡겨졌습니다). gazillion 파일이있는 경우 매우 효율적일 수 있습니다.

4

원본과 같이 grep 출력이 필요한 경우 다음을 수행 할 수 있습니다.

find . -type f | while read f; do 
  if head -n 50 "$f"|grep -s "matching string here"; then
    grep "matching string here" "$f" /dev/null 
  fi
done

파일 이름 만 필요한 경우 두 번째 grep을로 바꿀 수 있습니다 echo "$f".


1

원하는 기능을 얻으려면 몇 가지 다른 유틸리티를 결합해야합니다. find명령을 사용하여 디렉토리를 재귀하고 모든 head파일을 찾은 다음 발견 된 각 파일에서 명령을 실행하십시오 . 이 head명령은 각 파일의 처음 50 줄만 덤프하는 데 사용할 수 있습니다. 마지막으로 출력을 grep으로 파이프하여 원하는 문자열을 검색하십시오.

find . -type f -exec head -n 50 {} ";" | grep "matching string here"

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.