デフォルトでgrepがバイナリファイルを無視しないのはなぜですか?


94

のマンページでgrepは、-Iフラグについて次のように説明しています。

-I      Ignore binary files.  This option is equivalent to 
        --binary-file=without-match option.

また、バイナリファイルについても次のように述べています。

 --binary-files=value Controls searching and printing of binary files.
         Options are binary, the default: search binary files but do not print
         them; without-match: do not search binary files; and text: treat all
         files as text.

バイナリファイルの一致を気にするシナリオは考えられません。そのようなシナリオが存在する場合、それは通常ではなく例外でなければなりません。grepこのフラグを設定する必要がなく、デフォルトでバイナリファイルを無視しないのはなぜですか?


4
変数GREP_OPTIONSを好みの設定に設定すれば、それほど多くのコマンドラインスイッチを使用する必要はありません。
マルコ

2
このような変数をサポートしない他のコマンドに関する注意:.(ba|z|foo)shrc': エイリアスgrep = "grep -I" `でエイリアスを定義することにより、デフォルトオプションを設定できます。
エリック

1
これは実際には非常に便利です。たとえば、プロジェクトの統一バージョンを検索していて、どのファイルに保存されているか思い出せませんでした。バージョンの形式を検索すると、一致するバイナリファイルがいくつか見つかりました。バージョン5より前のバージョンであることが判明したため、バージョンはバイナリファイルにしか存在しなかったため、バイナリの一致がなければ見逃していた可能性があります。
ベンドハンセン

参考までに、「grepよりも優れた」ツールackがあります。Ackはバイナリファイルを検索しません。Debianでは、「ack-grep」という名前になります。
かずら定香

回答:


91

grepがバイナリファイルであると考えるすべてのものではなく、実際にはバイナリファイルです。たとえば、puppetのログにはANSIカラーコーディングが含まれているため、grepはそれらをバイナリと見なします。/ var / logを介してgrepしている場合でも、それらを検索したいです。


4
同じことがPDFファイルにも当てはまります。
ジョセフR.

12
+歴史的にgrepはそれを行うことができなかったため、互換性のためだけに、デフォルトはすべてを含む必要があります。
オリビエデュラック

2
@OlivierDulacは理にかなっています。それ以外の場合は、バイナリファイルを無視することがデフォルトです。
ダガン

5

grepバイナリファイルを検索する機能は、プログラムをコンパイルしているときにリンカー(ld)が一部の機能が見つからないという苦情を言うときにも役立ちます。次のようなコマンドを使用できます

grep function_name / lib / lib *

それを含むライブラリを見つけます。(ライブラリはバイナリファイルです。)


その場合、あなたはむしろ使用したいgrep -l function_name /lib/lib*か、nm -Do /lib/lib* | grep function_nameまたはldconfig -p | grep -o '/.*/lib.*' | xargs nm -Do | grep function_nameけれども。
ステファンシャゼル

まあ、grep some_function /lib/*短いですし、通常正しい答えを与える-私が探しているライブラリの名前。しかし、はい、時にはあなたのようなより洗練されたアプローチも必要です。
ダニエルフルジェスキ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.