私は約13Gサイズのファイルに対してgrepを実行しています。帰ってきている
Binary file file.xml matches
私はこれを期待していませんでした。次のコマンドを実行できるように、文字列を含むすべての行を返すと思いました。
grep "searchString" ./file.xml | wc -l
私の大きなファイルのsearchStringのすべての発生回数を返します。
答え1
grepはXMLファイルがテキストファイルではなくバイナリファイルだと思うようです。
grepがコンテンツに関係なくファイルをテキストとして処理するように強制するには、--text
次のようにスイッチ(GNU grep仮定)を使用できます。
grep --text "searchString" ./file.xml | wc -l
一致の数だけを計算したい場合は、grep --count
パイプの代わりに使用する方が良いwc -l
ので、パイプとプロセスの呼び出しを節約できます。
答え2
ファイルの先頭には珍しい記号があるように見え、grep
それをバイナリとして検出します。オプションを試すことができます--binary-files=text
。
grep --binary-files=text "searchString" file.xml | wc -l
マニュアルページから:
--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.
答え3
ご使用の際に間違いをさせていただきました./file.xml
。しようとした場合:
grep "searchString" file.xml | wc -l
何の問題がありますか?