web-dev-qa-db-ja.com

ファイル内で文字列パターンを検索しようとすると、grepが「バイナリファイル(標準入力)の一致」を返す

私はUbuntuでcat .bash_history | grep gitと入力しましたが、返されました

バイナリファイル(標準入力)の一致

私のbash_historyは存在し、その中にgitで始まる多くの行があります。

このエラーが表示された原因と修正方法を教えてください。

88
answerSeeker

おそらくファイル.bash_historyは非テキストデータで始まるため、grepはファイルをバイナリとして扱います。これはfile .bash_history出力:

.bash_history: data 

最初から数バイトを読み取って、適合するビューを表示できます。

head -c1K .bash_history 

ここでは最初の1 KiBを読んでいます。

STDOUTをhexdump/odなどにパイプできます。


補足として、grepはファイル名を引数として取るので、catはここでは役に立たない。これを試して:

grep git .bash_history
12
heemayl

grep -a 'pattern'を使用できます。

from man grep ページ:

-a、-text
バイナリファイルをテキストのように処理します。これは-binary-files = textオプションと同等です。

168
AK_

.bash_historyをgrepしたいときに同じ問題が発生したため、本日この質問を見ました。 (少し注意:新しい履歴が作成されるように、履歴の名前を変更しました。この新しい履歴はバイナリとして扱われませんでした。)

@heemaylsの回答では、grepはファイル名を受け取り、catは役に立たないことが述べられています。これは完全に真実ではありません。 greps manページから:

ファイルが指定されていない場合、またはファイル「-」が指定されている場合、grepは標準入力を検索します。

したがって、catを使用してgrepにパイプすることができます。ただし、これは.bash_historyがバイナリとして扱われるという問題を解決しません。正しいのは、履歴を直接grepするか、catとパイプを使用するかに関係なく、grep -a(@AK_からの回答のように)を使用することです。


cat .bash_history | grep -a git

または

grep -a git .bash_history

4
SSCMuchacho

エラーはデータがバイナリであるためです。stringsコマンドを使用して、通常検索する文字列部分を確認できます。

strings data | grep -i whatever
0
Gajraj Singh