저는 약 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
무슨 문제가 있나요?