(Windows)実行可能ファイルで特定の文字列を探しています。
最初は
grep -a string file
バイナリファイルをテキストファイルとして扱うからです。問題は、きちんとした出力がなく、改行文字が偶然に発生することです(正しいバイトが順番に来るとき)。
だから文字列を使うべきだと思いました。
strings file | grep -i string
驚くべきことに、 "strings" は "grep -a" を使用して見つかった文字列を見つけることができません。しかし、「文字列」の利点は、新しい行で見つかったすべての項目を出力できることです。
どうすれば両方の世界の利点を得ることができますか?これは、実際にすべてを探して、私が見つけたものの合理的な結果を得たいことを意味します。
答え1
strings
文字列と同じパターンが見つからない場合は、strings
4文字以上のパターンを見つけると発生する可能性があります。そして印刷できない文字が続きます。man strings
GNUから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文字の印刷可能文字シーケンスを印刷します。したがって、grep
コンテンツが4文字未満の場合、最初にstrings
viaを介して処理するとコンテンツが失われます。strings -n 1
最小長を1に設定するために使用されます。