我想在一组文件中找到一行hello world
的确切内容。例如,假设test1.txt
和test2.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
,但效果不佳。
有人可以帮忙吗?
答案 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