grep이 파일을 바이너리로 처리하는 이유는 무엇입니까?

grep이 파일을 바이너리로 처리하는 이유는 무엇입니까?

내 상자에는 Windows 시스템의 일부 데이터베이스 덤프가 있습니다. 텍스트 파일입니다. 나는 그들을 grep하기 위해 cygwin을 사용하고 있습니다. 이 파일은 일반 텍스트 파일인 것 같습니다. 메모장이나 워드패드와 같은 텍스트 편집기로 열었는데 깨끗해 보였습니다. 하지만 grep을 실행하면 binary file foo.txt matches.

NUL나는 이 파일들 에 데이터베이스 덤프의 아티팩트라고 가정하는 일부 ASCII 문자가 포함되어 있음을 발견했습니다 .

그렇다면 grep이 이러한 파일이 바이너리라고 생각하는 이유는 무엇입니까? 수치 NUL? 파일 시스템에 플래그가 있습니까? grep에서 행 일치 항목을 표시하려면 무엇을 변경해야 합니까?

답변1

NUL파일에 문자가 있으면 grep은 이를 바이너리 파일로 처리합니다.

이와 같은 해결 방법이 있을 수 있습니다 cat file | tr -d '\000' | yourgrep. 먼저 모든 null 값을 제거한 다음 파일을 검색하세요.

답변2

grep -a나를 위해 작동합니다:

$ grep --help
[...]
 -a, --text                equivalent to --binary-files=text

답변3

strings유틸리티를 사용하면 모든 파일에서 텍스트 콘텐츠를 추출하고 grep아래와 같이 파이프할 수 있습니다 strings file | grep pattern.

답변4

내 텍스트 파일 중 하나가 갑자기 grep에 의해 바이너리 파일로 처리됩니다.

$ file foo.txt
foo.txt: ISO-8859 text

해결책은 다음을 사용하여 변환하는 것입니다 iconv.

iconv -t UTF-8 -f ISO-8859-1 foo.txt > foo_new.txt

관련 정보