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


71

私はUbuntuを使用していますが、入力するcat .bash_history | grep gitと戻りました

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

bash_historyは存在し、そこには多くの行がありgitます。

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


file .bash_historyfile ~/.bash_history)の出力は?
-heemayl

出力は.bash_history: data
-answerSeeker

何らかの理由で、これはちょうど私のApacheログで起こっていました。
質疑応答に

回答:


11

おそらく、ファイル.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の問題を解決する方法がまだわかりませんhead -c1k .bash_history。.bash_historyファイルの最初の38行を読んでください。すべてが読解可能
-answerSeeker

2
@Tata​​kaiWasumiの出力はgrep -a git .bash_history
-heemayl

1
うまくいきました!欲しいものはすべて手に入れました。何を-aするの?
answerSeeker

6
@Tata​​kaiWasumi -agrep、ファイルをバイナリとして扱うようにします。
-heemayl

3
-agrepバイナリファイルをテキストのように処理します。
ラシュガー

128

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

man grepページから:

-a, --text
Process a binary file as if it were text; this is equivalent to the ‘--binary-files=text’ option.

これは、-zフラグを使用して複数の行で一致させるときに役立ちました。
ストラグ

この回答は、この質問に最適です。
マイケルパチェコ

はい、この答えははるかに適切です!
デイウォーカー

3

私はこの質問を今日見ました。なぜなら、私のgrepをしたいときに同じ問題があったからです.bash_history。(ちょっとした注意:私は履歴を改名して、新しい履歴を作成しました。この新しい履歴はバイナリとして扱われませんでした。)

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

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

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


cat .bash_history | grep -a git

または

grep -a git .bash_history


ありがとうございました!私にとってはうまくいく
マイケル・パチェコ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.