우분투에 있으며 cat .bash_history | grep git
를 입력했는데 반환되었습니다.
바이너리 파일 (표준 입력) 일치
내 bash_history
가 존재하고 그 안에 많은 줄이 있습니다. git
로 시작합니다.
이 오류를 표시하는 원인은 무엇이며 어떻게 해결할 수 있습니까?
댓글
에 감사드립니다. li>
답변
프레 수마 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
-a
는grep
를 만듭니다. 파일을 바이너리로 처리합니다. -
-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 시스템에 대한 제안이 있습니다.
file .bash_history
(file ~/.bash_history
)의 출력은 무엇입니까?.bash_history: data