搜索一行的完全匹配

时间:2013-11-13 00:21:50

标签: bash shell grep

我想在一组文件中找到一行hello world的确切内容。例如,假设test1.txttest2.txt都是文件夹中的.txttest1.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,但效果不佳。

有人可以帮忙吗?

5 个答案:

答案 0 :(得分:2)

grep -Fcx 'hello world'

应该这样做。对于多个输入文件,请使用

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

这样,cat将文件合并为grep的一个输入流,提供全局计数。

答案 1 :(得分:0)

grep -x -c "hello world" test.txt

结果会给你2个。

如果您想知道可以找到哪些行,您可以使用

grep -n -x "hello world" test.txt

答案 2 :(得分:0)

grep通常是最好和最快的工具,但是对于记录,如果你想要一个纯粹的bash方法,你可以这样做:

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

评论询问&#34;为什么要取消设置IFS?&#34; 。考虑如果我们在一行的开头或结尾有空格会发生什么(我假设从问题中我们想要一个完全匹配,所以额外的空格应该导致匹配失败):

$ 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

答案 3 :(得分:0)

grep有特殊字符'^'来匹配行的开头,'$'来匹配结尾,所以如果你这样做:

grep“^ hello world $”* .txt

您将获得您要查找的行,并且您可以为计数添加“| wc -l”,或者连接行并使用-c选项来grep(如上所述)。

答案 4 :(得分:0)

find . -name "you want file patterns" | xargs grep -x "hello world" | wc -l

在您的情况下,所需的命令是:

find . -name "*.txt" | xargs grep -x "hello world" | wc -l