0

我想在一组文件中找到一行的确切马赫数hello world。例如,假设test1.txtandtest2.txt.txt在文件夹中,并且test1.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将文件组合到一个输入流中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 有特殊字符 '^' 来匹配行首,'$' 来匹配行尾,所以如果你这样做:

grep "^hello world$" *.txt

你会得到你正在寻找的行,你可以为计数添加一个“| wc -l”,或者连接这些行并使用 -c 选项来 grep(如上面有人建议的那样)。

于 2013-11-13T05:43:29.607 回答
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
$ 

如果设置read了 IFS,则将根据 IFS 拆分行,然后将生成的标记分配给变量。由于我们在开头有空格,因此这被视为分隔符并被有效地丢弃。


事实上,如果我们使用内置变量$REPLY,我们完全不需要担心IFS。所以:

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