入力ファイルの2つのgrepメソッドの違い

入力ファイルの2つのgrepメソッドの違い

入力ファイルがありますが、これをscan.dataと呼びます。これには、私が把握したい単語のリストが含まれています。私はこれを行う2つの異なる方法を見つけましたが、結果は非常に異なります。

IFS=$' '    
find / -type f -exec grep -a -D skip -wo $(<scan.data) '{}' \;

これは3,799のゲームを提供します。

find / -type f -exec grep -a -D skip -of scan.data '{}' \;

これは私に18,167のゲームを提供します。

私が理解したように、IFSを設定すると、サブシェルの内容をリストとして出力でき、デフォルトで2番目のケースの機能をミラーリングできます。それでは、二人の結果がこのように大きな違いを示す理由は何だろうか?

ベストアンサー1

コマンド置換が引用されていて(そうでない場合のほとんどの単語はscan.data実行するファイル名として扱われますgrep)、ファイルの最初の単語がダッシュで始まらないと仮定します(そうであれば、おそらくオプションとして解釈されます)。grep両方の呼び出しは、使用されたオプションを除いて本質的に同じです。最初のバリアントには大量のデータが含まれていると、scan.data「パラメータのリストが長すぎます。」エラーが発生する可能性もあります。

  1. 最初は正規grep表現-wで読み取ったパターンを使用してscan.data一致を試みます。完全な言葉findユーティリティに提供されたファイルの各行でtheいいえ)の先頭に一致しますtheodore
  2. 2番目はgrep使用されません-w。正規表現から読み取ったパターンを使用してscan.data一致を試みます。サブストリングfindユーティリティに提供されたファイルの各行に(theの先頭で一致theodore

これはあなたが得る一致数の違いを説明することができます。

ユーティリティがファイルのパターンを正規表現-Fではなく文字列として使用したい場合(パターンファイルの正規表現に特殊文字が含まれているが文字通り一致する必要がある場合など)。grepscan.data.[*

ファイルにパターンがある場合-f。コマンド置換を使用することは可能ですが、制限されている場合にのみ可能です(この回答の上部に記載されているように、最初の文字列には初期ダッシュがなく、適切な量の文字列しかありません)。このオプションがある場合は、-fコマンド置換の使用はまったく必要ありません。

おすすめ記事