Linuxのgrep検索で「バイナリー・ファイル(標準入力)は一致しました」と表示される原因と解決方法

Redhat系のLinux(CentOS 6、Scientific Linuxなど)で人からもらったテキストファイルをgrep検索すると、

バイナリー・ファイル(標準入力)は一致しました

というメッセージが1行だけ表示されて肝心の中身が表示されない、ということがあって困った。

例えば、memo.txtというファイルから大文字小文字に関係なく「html」という文字列を含む行を抽出してLinuxコンソールで表示するコマンドを考えてみる。

<memo.txtの中身>
aaa.html
bbbb.txt
ccc.html
ddd.aaa
fff.HTML

<実行するコマンド>
cat memo.txt | grep -i html

本来は、この時に期待する結果(コンソールに表示される内容)は以下となる。

aaa.html
ccc.html
fff.HTML

それが、このようにはならず、

バイナリー・ファイル(標準入力)は一致しました

とだけ表示される。

このメッセージで推測すると、どうやらgrep対象のファイルがテキストファイルではなく、バイナリファイルとして処理されているようだ。

CentOS 6のmanコマンドでgrepコマンドのマニュアルを見てみると、以下の記述があった。

《CentOS 6のmanコマンドで確認できるgrepコマンドのマニュアル(一部抜粋)》

File and Directory Selection
-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.

このマニュアルを見ると、grep対象のファイルの冒頭の数バイトにバイナリと思われるデータが含まれる場合は、grepコマンドとしてはファイルをバイナリファイルとして扱い、grepパターンにマッチする場合は、「a binary file matches」というメッセージを1行だけ表示し、マッチしない場合は何もメッセージを表示しない、という動きになることが分かった。

ここで、もらったテキストファイルをよく見ていると、冒頭の数行に変な文字列があった。この文字列がなければ、grep対象のファイルがバイナリファイルであると認識されずに済んだのであろう……。

Linuxのgrep検索で「バイナリー・ファイル(標準入力)は一致しました」と表示される時の原因

→grep検索対象のファイル冒頭の数バイトにバイナリファイルであることを示す(バイナリファイルであると誤解される)文字列が含まれている

Linuxのgrep検索でgrep対象のファイルをバイナリファイルではなく、テキストファイルとして扱いたい場合(解決方法)

→grep対象のファイルをバイナリファイルではなく、テキストファイルとして扱いたい場合は、grepコマンドに「-a」、「--text」、「--binary-files=text」といったオプションを付与すればよい。

「-a」オプションを付与する場合
cat memo.txt | grep -i -a html

「--text」オプションを付与する場合
cat memo.txt | grep -i --text html

「--binary-files=text」を付与する場合
cat memo.txt | grep -i --binary-files=text html

記憶できそうなオプションは、「--text」だろうか。

試してみると、どれを実行しても同じ結果が得られた。

マニュアルには「Warning: grep --binary-files=text might output binary garbage」という注意書きがあるので、今後、使う時には注意が必要かもしれない。

前へ

伊藤園「緑の野菜 初音ミクバージョン ぽっぴぽー 未来野菜 野菜&フルーツミックス」を飲んだ

次へ

VMware Player 5をWindows 7にインストールし、CentOS 6をゲストOSとしてインストールする