私はUbuntuでcat .bash_history | grep git
と入力しましたが、返されました
バイナリファイル(標準入力)の一致
私のbash_history
は存在し、その中にgit
で始まる多くの行があります。
このエラーが表示された原因と修正方法を教えてください。
おそらくファイル.bash_history
は非テキストデータで始まるため、grep
はファイルをバイナリとして扱います。これはfile .bash_history
出力:
.bash_history: data
最初から数バイトを読み取って、適合するビューを表示できます。
head -c1K .bash_history
ここでは最初の1 KiBを読んでいます。
STDOUTをhexdump
/od
などにパイプできます。
補足として、grep
はファイル名を引数として取るので、cat
はここでは役に立たない。これを試して:
grep git .bash_history
grep -a 'pattern'
を使用できます。
from man grep ページ:
-a、-text
バイナリファイルをテキストのように処理します。これは-binary-files = textオプションと同等です。
.bash_history
をgrepしたいときに同じ問題が発生したため、本日この質問を見ました。 (少し注意:新しい履歴が作成されるように、履歴の名前を変更しました。この新しい履歴はバイナリとして扱われませんでした。)
@heemaylsの回答では、grep
はファイル名を受け取り、cat
は役に立たないことが述べられています。これは完全に真実ではありません。 grep
s manページから:
ファイルが指定されていない場合、またはファイル「-」が指定されている場合、grepは標準入力を検索します。
したがって、cat
を使用してgrep
にパイプすることができます。ただし、これは.bash_history
がバイナリとして扱われるという問題を解決しません。正しいのは、履歴を直接grep
するか、cat
とパイプを使用するかに関係なく、grep -a
(@AK_からの回答のように)を使用することです。
cat .bash_history | grep -a git
または
grep -a git .bash_history
エラーはデータがバイナリであるためです。stringsコマンドを使用して、通常検索する文字列部分を確認できます。
strings data | grep -i whatever