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
$
如果设置read
了 IFS,则将根据 IFS 拆分行,然后将生成的标记分配给变量。由于我们在开头有空格,因此这被视为分隔符并被有效地丢弃。
事实上,如果我们使用内置变量$REPLY
,我们完全不需要担心IFS
。所以:
{ c=0; while read -r; do [ "$REPLY" = "hello world" ] && ((c++)); done; echo $c; } < test.txt