Grep 출력 문제

Grep 출력 문제

좋아, 외장 하드 드라이브에서 grep을 사용하고 있어

예,

M:/

grep -rhI "bananas" . > out.txt

그러면 "M:/"에 "banana"가 포함된 모든 줄이 출력됩니다.

그러나 파일의 전체 내용을 출력하고 싶기 때문에 example.txt의 줄에 "bananas"가 포함되어 있으면 example.txt의 전체 내용이 출력되고 디렉토리 "M:/" . " 바나나".

답변1

grep -r "bananas" | cut -d: -f1 | xargs cat >> result.txt

grep

  • -r: 재귀. 각 디렉터리의 모든 파일을 반복적으로 읽습니다.

결과: file_name:text각 행에 대해. 예를 들어 foo.txt:bananas.

이제 각 줄에서 파일 이름을 가져와야 합니다.

자르다sed부분선 삭제를 위한 간단한 편집기( 또는 여기를 사용할 수 있지만 awk잘라내기가 간단함)

  • -d분리 기호. 게시물 파일이 있으므로 :구분 기호는 다음과 같습니다.-d:
  • -f출력을 필드로 분할합니다. 어느 것을 복용해야 합니까? -f1- 첫 번째!

매개변수

이제 파일 목록이 생겼습니다. 그들과 관련이 있나요? xargs표준 입력에서 명령줄을 작성하고 실행하는 데 이를 사용합니다 . 표준 입력에서 파일 이름을 받아들이고 cat파일 이름을 인수로 제공하는 각 줄에 대해 실행됩니다. 간단히 cat그 내용을 표준 출력으로 인쇄합니다.

>>"파일에 추가"를 의미합니다.

답변2

grep -rlZI "bananas" . | xargs -0 cat > out.txt

-lZ일치하는 파일 이름의 빈 구분 목록을 출력합니다 .

-l, --files-with-matches
       Suppress normal output; instead print the  name  of  each  input
       file  from  which  output would normally have been printed.  The
       scanning will stop on the first match.

-Z, --null
       Output a zero byte (the ASCII  NUL  character)  instead  of  the
       character  that normally follows a file name.  For example, grep
       -lZ outputs a zero byte after each  file  name  instead  of  the
       usual  newline.   This option makes the output unambiguous, even
       in the presence of file names containing unusual characters like
       newlines.   This  option  can  be  used  with commands like find
       -print0, perl -0, sort -z, and xargs  -0  to  process  arbitrary
       file names, even those that contain newline characters.

grep 버전이 해당 옵션을 제공하지 않는 경우 일반으로 돌아갈 수 있습니다. 그러면 -Z구분 기호를 개행 문자로 설정하는 한 -l공백이 포함된 파일 이름(당연히 개행 문자는 포함되지 않음)을 처리 할 수 있습니다.xargs

grep -rlI "bananas" . | xargs -d '\n' cat > out.txt

관련 정보