0

ファイルのセットで、行の正確なマッハを見つけたいと思いますhello world。たとえば、test1.txtandtest2.txtはすべて.txtフォルダー内にあり、andtest1.txtは次のようになります。

hello world
a hello world

そしてtest2.txt次のとおりです。

hello world b
helloworld
hello world
hello world

3のリターンとして期待しhello worldます。しかし、私が知っているのはgrep -l "hello world" *.txt | wc -l、うまく機能しないことです。

誰でも助けてもらえますか?

4

5 に答える 5

2
grep -Fcx 'hello world'

するべきです。複数の入力ファイルの場合は、

cat *.txt | grep -Fcx 'hello world'

このように、catはファイルを の 1 つの入力ストリームに結合しgrep、グローバル カウントを提供します。

于 2013-11-13T00:26:30.163 に答える
0
find . -name "you want file patterns" | xargs grep -x "hello world" | wc -l

あなたの状況では、望ましいコマンドは次のとおりです。

find . -name "*.txt" | xargs grep -x "hello world" | wc -l
于 2014-04-17T15:30:34.423 に答える
0
grep -x -c "hello world" test.txt

結果として2が得られます。

ヒットがどの行にあるか知りたい場合は、次を使用できます

grep -n -x "hello world" test.txt
于 2013-11-13T00:34:00.513 に答える
0

grep通常、これには最適かつ最速のツールですが、記録として、純粋な bash メソッドが必要な場合は、次のようにすることができます。

$ { c=0; while IFS='' read -r line; do [ "$line" = "hello world" ] && ((c++)); done; echo $c; } < test.txt 
2
$ 

コメントは、「なぜ設定を解除するのIFSですか?」と尋ねます。. 行頭または行末に空白があるとどうなるか考えてみてください (質問から推測すると、完全一致が必要なので、余分な空白が原因で一致が失敗するはずです)。

$ echo " hello world" | { c=0; while read -r line; do [ "$line" = "hello world" ] && ((c++)); done; echo $c; }
1
$ echo " hello world" | { c=0; while IFS='' read -r line; do [ "$line" = "hello world" ] && ((c++)); done; echo $c; }
0
$ 

IFS が設定されている場合は、readIFS に従って行を分割し、結果のトークンを変数に割り当てます。先頭に空白があるため、これはセパレータとして扱われ、事実上破棄されます。


実際、組み込み変数を使用すれば、まったく$REPLY心配する必要はありませんIFS。そう:

{ c=0; while read -r; do [ "$REPLY" = "hello world" ] && ((c++)); done; echo $c; } < test.txt
于 2013-11-13T00:43:54.157 に答える