バイナリがたくさんあり、これらのバイナリの中に検索したい文字列があることを知っています。
次のことを実行したい:
grep -lir "the string I am looking for"
特定のディレクトリ内で、その文字列を含むがは明らかにこれらのファイルを処理していません。
端末からこの種の検索を実行できるコマンドはありますか?
回答
With GNU grep の場合、 -a オプションを使用して、バイナリファイルをテキストファイルとして扱うことができます。
grep -ali -- string file
grepバージョンが-a
をサポートしていない場合は、 ack 。 ack 1.xでは、-a
オプションを含める必要がありますが、ack 2.xでは、デフォルトで非テキストファイルを検索するときに含まれます(非テキストファイルは無視されます)。ファイルを指定しなかった場合のテキストファイル)。
コメント
回答
コマンドstrings
はextrファイルからすべてのASCIIデータを処理し、その出力をgrep
すると、データを検索できます。
strings <filename> | grep "search text"
コメント
- これは受け入れられた答えであるはずです。このバイナリはこのタスクに適しています。
- @xeon:'は必ずしも
strings
を使用するとは限りません。 、詳細については、こちらをお読みください。 - 目標はどのバイナリに文字列が含まれているかを判断することなので、
strings -f
の方が適切です。 - これがより良い答えです。
- 最良の答えです。どうもありがとうございました
回答
あなたの質問は、パターンを含むバイナリファイルを見つけることです(そして私たちはすでに非常に良い答えです!)。補足として、オカレンスを取得したい場合があります。
私はよく使用します
grep -aPo ".{0,20}pattern.{0,20}" binfile
20文字の周囲のコンテキストを取得します。
ack
'の自己記述?(マニュアル内)" ack 2.xは、そうでないすべての通常の非バイナリファイルを検索します明示的に無視された[byblah blah] "したがって、内容がバイナリに見える場合でも、ack2.xはファイルの読み取りを早期に停止する必要があるようです。ack grep /bin/grep
を試してみると、結果が得られます。混乱を避けるために、回答を更新しました。