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 が設定されている場合は、read
IFS に従って行を分割し、結果のトークンを変数に割り当てます。先頭に空白があるため、これはセパレータとして扱われ、事実上破棄されます。
実際、組み込み変数を使用すれば、まったく$REPLY
心配する必要はありませんIFS
。そう:
{ c=0; while read -r; do [ "$REPLY" = "hello world" ] && ((c++)); done; echo $c; } < test.txt