web-dev-qa-db-ja.com

テキストのように見えるバイナリファイルをgrepする方法を教えてください。

テキストである必要があるバイナリファイルがあります(それらはエクスポートされたログです)。それ以下では開くことができません(見栄えが悪い-バイナリファイルのように見えます)。私はそれをviで開くことができ、猫を付けることができることを発見しました(実際のログが表示されます)が、実際に実行したいのは、それらをgrepすることです(viでそれぞれを開いてから実行する必要はありません)検索)。それを行う方法はありますか?

76
Robyn Smith

とにかくgrepを使用してファイルを検索できます。入力ファイルが本当にテキストかどうかは関係ありません。 「man grep」から:

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

   --binary-files=TYPE
          If  the  first few bytes of a file indicate that the file contains binary data, assume that the file is
          of type TYPE.  By default, TYPE is binary, and grep normally outputs either a one-line  message  saying
          that a binary file matches, or no message if there is no match.  If TYPE is without-match, grep assumes
          that a binary file does not match; this is equivalent  to  the  -I  option.   If  TYPE  is  text,  grep
          processes  a  binary  file  as  if  it  were  text; this is equivalent to the -a option.  Warning: grep
          --binary-files=text might output binary garbage, which can have nasty side effects if the output  is  a
          terminal and if the terminal driver interprets some of it as commands.

2番目の段落の最後に注意事項を記入してください。 grepの結果を新しいファイルにリダイレクトし、vi/lessでこれを調べることができます。

85
Axel Knauf

パイプラインしてstringsを実行します。これにより、すべてのバイナリコードが削除され、テキストのみが残ります。

41
Mike Scott

bgrepを試してみてください。 ( 元のリリース / より最近のフォーク

6
quanta

次の3つのコマンドを使用できます。

  1. grep -a <sth> file.txt

  2. cat -v file.txt | grep <sth>

  3. cat file.txt | tr '[\000-\011\013-\037\177-\377]' '.' | grep <sth>

5
MLSC

Grep 2.21以降、バイナリファイルは 別の方法で処理されます

バイナリデータを検索するとき、grepはテキスト以外のバイトを行末記号として扱うようになりました。これにより、パフォーマンスが大幅に向上します。

つまり、バイナリデータでは、すべての非テキストバイト(改行を含む)が行ターミネータとして扱われます。この動作を変更する場合は、次のことができます。

  • 使用する --text。これにより、改行のみが行末記号になります。

  • 使用する --null-data。これにより、nullバイトのみが行ターミネーターになります。

1
Steven Penny