grep은

파일에서 문자열 패턴을 찾으려고 할 때 “ 바이너리 파일 (표준 입력) 일치 ”를 반환합니다. div class = “question”>

우분투에 있으며 cat .bash_history | grep git를 입력했는데 반환되었습니다.

바이너리 파일 (표준 입력) 일치

bash_history가 존재하고 그 안에 많은 줄이 있습니다. git로 시작합니다.

이 오류를 표시하는 원인은 무엇이며 어떻게 해결할 수 있습니까?

댓글

  • file .bash_history (file ~/.bash_history)의 출력은 무엇입니까?
  • 출력은 .bash_history: data
  • 어떤 이유에서인지 아파치 로그에서만 발생했습니다. q & a

에 감사드립니다. li>

  • 매우 밀접한 관련이 있음 : unix.stackexchange.com/q/19907/5510
  • 답변

    프레 수마 bly 파일 .bash_history는 텍스트가 아닌 데이터로 시작하므로 grep는 파일을 바이너리로 취급합니다. 이는 file .bash_history 출력에 의해 확인됩니다.

    .bash_history: data 

    처음부터 몇 바이트를 읽고 보기 :

    head -c1K .bash_history 

    여기에서 처음 1KiB를 읽었습니다.

    STDOUT을 hexdump / od 또는 유사합니다.


    참고로 grep는 파일 이름 ( s) 인수로 사용하므로 여기서 cat는 쓸모가 없습니다. 시도해보세요 :

    grep git .bash_history 

    댓글

    • 나 ' 아직 grep 문제를 해결하는 방법을 모르겠습니다. head -c1k .bash_history는 .bash_history 파일의 처음 38 줄을 읽었습니다. 모든 것을 읽을 수있었습니다.
    • @TatakaiWasumi grep -a git .bash_history의 결과는 무엇입니까?
    • 작동했습니다! 나는 그것에서 내가 원하는 모든 것을 얻었습니다. -a는 무엇을합니까?
    • @TatakaiWasumi -agrep를 만듭니다. 파일을 바이너리로 처리합니다.
    • -a grep 바이너리 파일을 텍스트처럼 처리합니다.

    답변

    grep -a "pattern"를 사용할 수 있습니다.

    man grep 페이지 :

    -a, –text
    바이너리 파일을 마치 텍스트처럼 처리합니다. 이는 -binary-files = text 옵션과 동일합니다.

    댓글

    • -z 플래그를 사용하여 여러 줄을 일치시킬 때 도움이되었습니다.
    • 저에게는 효과가 있었지만 내 파일이 바이너리 파일이 아니기 때문에 ' 여전히 이상합니다. [grid @ serverdg2 trace] $ file listener.log listener.log : data

    Answer

    .bash_history를 grep하려는 경우에도 동일한 문제가 발생합니다. (작은 참고 : 새 기록이 생성되도록 내 기록의 이름을 변경했습니다.이 새로운 기록은 바이너리로 취급되지 않았습니다.)

    @heemayls에서 대답하면 grep는 파일 이름을 취하고 cat는 쓸모가 없습니다. 이것은 전적으로 사실이 아닙니다. grep의 man 페이지에서 :

    파일이 지정되지 않았거나 파일 “-“가 주어진 경우 grep은 표준 입력을 검색합니다.

    따라서 cat를 사용하여 grep. 그러나 이것은 .bash_history가 바이너리로 취급되는 문제를 해결하지 않습니다. 유일하게 올바른 방법은 grep 히스토리를 직접 또는 iv id와 함께 사용하든 관계없이 grep -a (@ AK_의 답변처럼)를 사용하는 것입니다. = “df40deca6b”>

    및 파이프.


    cat .bash_history | grep -a git 

    또는

    grep -a git .bash_history 

    Answer

    오류는 파일의 데이터가 바이너리이기 때문에 발생합니다. strings 명령을 사용하여 사람이 읽을 수 있는지 확인할 수 있습니다 (예 : strings) 일반적으로 grep

    를 사용하여 검색하는 부분입니다.

    strings data | grep -i whatever

    댓글

    • 이것은 질문의 첫 부분, 즉 " 원인을 다루지 않습니다. 문제 ".

    답변

    이 원인 일 수 있습니다. bash 기록에서 null 바이트로. 널 문자가있는 줄을 제거하면 문제가 해결 될 수 있습니다. grep “의 Perl-regexp 모드를 사용하여 확인할 수 있습니다.

    grep -Pa "\x00" .bash_history 

    이 게시물 에는 비 Unix 시스템에 대한 제안이 있습니다.

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다