使用grep计算许多文件中所有出现的字符串

时间:2008-12-16 12:12:56

标签: grep

我有一堆日志文件。我需要找出所有文件中出现字符串的次数。

grep -c string *

返回

...
file1:1
file2:0
file3:0
...

使用管道我只能获得具有一个或多个出现次数的文件:

grep -c string * | grep -v :0

...
file4:5
file5:1
file6:2
...

我怎样才能获得合并计数? (如果它返回file4:5, file5:1, file6:2,我想回到8。)

15 个答案:

答案 0 :(得分:288)

这适用于每行多次出现:

grep -o string * | wc -l

答案 1 :(得分:285)

cat * | grep -c string

答案 2 :(得分:27)

grep -oh string * | wc -w

将计算一行中的多次出现次数

答案 3 :(得分:20)

而不是使用-c,只需将其传递给wc -l。

grep string * | wc -l

这将在一行中列出每个匹配项,然后计算行数。

但这会错过字符串在一行上出现2次以上的情况。

答案 4 :(得分:15)

cat * | grep -c string

cat的一个罕见的有用应用。

答案 5 :(得分:9)

与以前的所有答案不同的是:

perl -lne '$count++ for m/<pattern>/g;END{print $count}' *

答案 6 :(得分:7)

您可以添加-R以递归搜索(并避免使用cat)和-I来忽略二进制文件。

grep -RIc string .

答案 7 :(得分:6)

强制性AWK解决方案:

grep -c string * | awk 'BEGIN{FS=":"}{x+=$2}END{print x}'

请注意文件名是否包含“:”。

答案 8 :(得分:5)

AWK解决方案还处理文件名,包括冒号:

grep -c string * | sed -r 's/^.*://' | awk 'BEGIN{}{x+=$1}END{print x}'

请注意,此方法仍然在同一行上发现多次出现string

答案 9 :(得分:4)

如果您想要每个文件的出现次数(字符串“tcp”的示例):

grep -RIci "tcp" . | awk -v FS=":" -v OFS="\t" '$2>0 { print $2, $1 }' | sort -hr

示例输出:

53  ./HTTPClient/src/HTTPClient.cpp
21  ./WiFi/src/WiFiSTA.cpp
19  ./WiFi/src/ETH.cpp
13  ./WiFi/src/WiFiAP.cpp
4   ./WiFi/src/WiFiClient.cpp
4   ./HTTPClient/src/HTTPClient.h
3   ./WiFi/src/WiFiGeneric.cpp
2   ./WiFi/examples/WiFiClientBasic/WiFiClientBasic.ino
2   ./WiFiClientSecure/src/ssl_client.cpp
1   ./WiFi/src/WiFiServer.cpp

说明:

  • grep -RIci NEEDLE . - 从当前目录(符号链接后)递归查找字符串NEEDLE,忽略二进制文件,计算出现次数,忽略大小写
  • awk ... - 此命令忽略出现次数为零的文件并格式化行
  • sort -hr - 按第一列中的数字按相反顺序对行进行排序

当然,它也可以与其他带有选项-c(计数)的grep命令一起使用。例如:

grep -c "tcp" *.txt | awk -v FS=":" -v OFS="\t" '$2>0 { print $2, $1 }' | sort -hr

答案 10 :(得分:3)

您可以使用简单的grep来有效捕获出现的次数。我将使用-i选项确保正确捕获STRING/StrING/string

提供文件名称的命令行:

grep -oci string * | grep -v :0

删除文件名的命令行,如果有没有出现的文件,则打印0:

grep -ochi string *

答案 11 :(得分:2)

递归变体:

find . -type f -exec cat {} + | grep -c 'string'

答案 12 :(得分:1)

这是一种比grep更快的AWK替代方法,可以在目录中的XML文件集合中处理每行<url>的多个匹配:

awk '/<url>/{m=gsub("<url>","");total+=m}END{print total}' some_directory/*.xml

这适用于某些XML文件没有换行符的情况。

答案 13 :(得分:1)

我使用grep for windows测试的Grep only解决方案:

grep -ro "pattern to find in files" "Directory to recursively search" | grep -c "pattern to find in files"

即使一行上有多个,此解决方案也会计算所有出现次数。 -r以递归方式搜索目录,-o将&#34;仅显示与PATTERN&#34;匹配的行的一部分。 - 这就是在一行上分割多个出现的内容,并使grep在新行上打印每个匹配;然后将这些换行符分隔的结果通过-c传回grep,以使用相同的模式计算出现次数。

答案 14 :(得分:0)

另一个使用基本命令行函数的衬管,每行处理多次出现。

 cat * |sed s/string/\\\nstring\ /g |grep string |wc -l