ファイルをgrepingすると、grepは行の代わりにtrueを返します。なぜですか?

ファイルをgrepingすると、grepは行の代わりにtrueを返します。なぜですか?

私は約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

何の問題がありますか?

関連情報