파일을 greping할 때 grep은 줄 대신 true를 반환합니다. 이유는 무엇입니까?

파일을 greping할 때 grep은 줄 대신 true를 반환합니다. 이유는 무엇입니까?

저는 약 13G 크기의 파일에 대해 grep을 실행하고 있습니다. 그것은 돌아오고있다

Binary file file.xml matches

저는 이것을 기대하지 않았습니다. 다음 명령을 실행할 수 있도록 문자열이 포함된 모든 줄을 반환할 것이라고 생각했습니다.

grep "searchString" ./file.xml | wc -l 

내 큰 파일에서 searchString의 모든 발생 횟수를 반환합니다.

답변1

grep은 XML 파일이 텍스트 파일이 아닌 바이너리 파일이라고 생각하는 것 같습니다.

grep이 내용에 관계없이 파일을 텍스트로 처리하도록 강제하려면 --text다음과 같이 스위치(GNU grep 가정)를 사용할 수 있습니다.

grep --text "searchString" ./file.xml | wc -l

일치 항목 수만 계산하려는 경우에는 grep --count파이프 대신 사용하는 것이 더 좋으 wc -l므로 파이프 및 프로세스 호출을 절약할 수 있습니다.

답변2

파일의 시작 부분에 특이한 기호가 있는 것으로 보이며 grep이를 바이너리로 감지합니다. 옵션을 시도해 볼 수 있습니다 --binary-files=text.

grep --binary-files=text "searchString" file.xml | wc -l

매뉴얼 페이지에서:

   --binary-files=TYPE
          If the first few bytes of a file indicate that the file contains
          binary  data, assume that the file is of type TYPE.  By default,
          TYPE is binary, and grep  normally  outputs  either  a  one-line
          message  saying  that  a  binary  file matches, or no message if
          there is no match.  If TYPE is without-match, grep assumes  that
          a  binary  file  does  not  match;  this is equivalent to the -I
          option.  If TYPE is text, grep processes a binary file as if  it
          were  text;  this is equivalent to the -a option.  Warning: grep
          --binary-files=text might output binary garbage, which can  have
          nasty  side  effects  if  the  output  is  a terminal and if the
          terminal driver interprets some of it as commands.

답변3

사용하시다가 실수를 하신 것 같습니다 ./file.xml. 시도하는 경우:

grep "searchString" file.xml | wc -l

무슨 문제가 있나요?

관련 정보