grep を使用して見つかったテキストを出力しない文字列

grep を使用して見つかったテキストを出力しない文字列

(Windows) 実行可能ファイル内の特定の文字列を探しています。

まず最初に

grep -a string file

これはバイナリ ファイルをテキスト ファイルのように扱うためです。問題は、出力がきちんと行われず、改行が偶然に発生する (正しいバイトが順番に来るとき) などです。

そこで、文字列を使用することにしました:

strings file | grep -i string

驚いたことに、「strings」では、「grep -a」を使用して検索できた文字列が見つかりません。ただし、「strings」は、見つかった各項目を新しい行に出力する点で優れています。

どうすれば両方の長所を活かせるでしょうか? つまり、本当にすべてを見つけたいし、見つかったものの合理的な出力も得たいのです。

答え1

strings文字列と同じパターンが見つからないのはstrings、少なくとも4文字の長さのパターンが見つかったことが原因である可能性が高いです。そして印刷できない文字が続きます。GNUman stringsの場合strings:

For each file given, GNU strings prints the printable character
sequences that are at least 4 characters long (or the number given
with the options below) and are followed by an unprintable character.

さらに、stringsデフォルトではオブジェクト ファイルの初期化およびロードされたセクションのみをスキャンするため、出力される行数がさらに削減される可能性があります。

この動作を変更するには、-aおよびオプションを試すことができます。-n

strings -n 1 -a file | grep -i string

そうすれば、より多くの文字列が得られ、おそらく期待どおりの結果が得られるはずです。

実行可能ファイルの出力の違いpython:

$ strings $(which python) | wc
  31923   68075  474068
$ strings -n 1 $(which python) | wc
 501231  531837 1541204
$ strings -n 1 -a $(which python) | wc
 501398  531995 1541762

答え2

なぜだめですか:

grep -a string file | strings

strings少なくとも 4 文字の長さの印刷可能な文字シーケンスを印刷します。したがって、grep4 文字より短い文字を検索すると、strings最初に で処理すると、その文字が省略されます。strings -n 1最小長を 1 に設定するには、 を使用します。

関連情報