テキストのように見えるバイナリファイルをgrepする方法は?


76

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



11
試しましたgrep -aか?
クォンタ

回答:


85

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でこれを調べることができます。


grepは実際には機能しません。ストレージデバイスでgrepを試してください。メモリが不足します。妥当な長さの行に依存する壊れた内部バッファリングメカニズムがあります。
user239558

41

それをパイプ処理してstrings、すべてのバイナリコードを取り除き、テキストだけを残します。


strings明らかにUTF-8がテキストであることを理解していません。
ハビエル

6

与えるbgrep試みを。(元のリリース / 最近のフォーク


ここが最良の答えだと思います。ここのようなバイナリサーチの悪い実装が見てとても迷惑ですcommandlinefu.com/commands/matching/grep-binary/...によってエスケープはどこ\x本当にここのように動作しませんgrep -P "\x05\x00\xc0" mybinaryfile
レオレオポルトヘルツ준영

実行しますbgrep "fafafafa" test_27.6.2015.bin |lessが、test_27.6.2015.bin:00005ee4を取得します。私はこれを検索していたので、fafafafaを取得すると仮定します。マニュアルはありません。なぜこのような出力が発生するのでしょうか?
レオレオポルトヘルツ준영

私はここbgrepの機能について、新しいスレッドを開いたstackoverflow.com/q/31135561/54964
レオ・レオポルド・ヘルツ준 영

違いは何grep -aですか?
rubo77

残念ながら、bash: bgrep: command not found...そしてNo package bgrep available

5

次の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>


trは私のsolaris 10ボックスでは動作しないようです。簡単なテスト:echo -e 'x \ ty' | tr '[\ 000- \ 011 \ 013- \ 037 \ 177- \ 377]' '。' タブを翻訳しません。
user55570

1

Grep 2.21以降、バイナリファイルの扱いが異なります。

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

したがって、今起こっているのは、バイナリデータでは、すべての非テキストバイト(改行を含む)が行終端記号として扱われるということです。この動作を変更する場合、次のことができます。

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

  • を使用します--null-data。これにより、nullバイトのみが行末記号になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.