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

Žel*_*pin 286 grep

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

grep -c string *
Run Code Online (Sandbox Code Playgroud)

回报

...
file1:1
file2:0
file3:0
...
Run Code Online (Sandbox Code Playgroud)

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

grep -c string * | grep -v :0

...
file4:5
file5:1
file6:2
...
Run Code Online (Sandbox Code Playgroud)

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

小智 291

这适用于每行多次出现:

grep -o string * | wc -l
Run Code Online (Sandbox Code Playgroud)

  • 这也有效:`grep -o string*--exclude-dir = some/dir/one/--exclude-dir = some/dir/two | wc -l`. (2认同)
  • `grep -ioR string*| wc -l`是我用来做一个不区分大小写,递归,仅匹配的搜索 (2认同)
  • 这个显示相关文件,然后显示匹配的总数:`grep -rc test。| awk -F: '$NF > 0 {x+=$NF; $NF=""; 打印} END{打印“总计:”,x}'` (2认同)

Bom*_*mbe 286

cat * | grep -c string
Run Code Online (Sandbox Code Playgroud)

  • 不解决一行中的多次出现 (46认同)
  • 这具有相同的限制,即它仅在一行上计数多次出现次数.我猜这种行为在这种情况下是可以的. (9认同)
  • 我宁愿做`grep -c string <*`所以只需用小于的空格替换空格. (2认同)
  • 如果你想在子目录中搜索,这不起作用,而`grep -o`和`wc -l`也可以.尽管像原来的问题,猫更快. (2认同)

小智 28

grep -oh string * | wc -w
Run Code Online (Sandbox Code Playgroud)

将计算一行中的多个事件

  • "grep -oh"......我的咖喱很强"*>> wc` :) (23认同)

Mic*_*ren 22

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

grep string * | wc -l
Run Code Online (Sandbox Code Playgroud)

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

但是,这将错过字符串在一行上出现2次以上的情况.

  • 管道到"wc -l"也很适合"grep -r'test'." 它在当前目录下的所有目录中递归扫描字符串'test'的所有文件. (2认同)

Joa*_*uer 16

cat * | grep -c string
Run Code Online (Sandbox Code Playgroud)

一个罕见的有用的应用程序cat.


Vij*_*jay 9

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

perl -lne '$count++ for m/<pattern>/g;END{print $count}' *
Run Code Online (Sandbox Code Playgroud)


azm*_*euk 8

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

grep -RIc string .
Run Code Online (Sandbox Code Playgroud)


小智 7

必须的AWK解决方案:

grep -c string * | awk 'BEGIN{FS=":"}{x+=$2}END{print x}'
Run Code Online (Sandbox Code Playgroud)

如果您的文件名包含":",请注意.


And*_*kha 6

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

grep -RIci "tcp" . | awk -v FS=":" -v OFS="\t" '$2>0 { print $2, $1 }' | sort -hr
Run Code Online (Sandbox Code Playgroud)

示例输出:

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
Run Code Online (Sandbox Code Playgroud)

解释:

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

当然,它也适用于其他带有选项-c(count) 的grep 命令。例如:

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


Kre*_*uvf 5

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

grep -c string * | sed -r 's/^.*://' | awk 'BEGIN{}{x+=$1}END{print x}'
Run Code Online (Sandbox Code Playgroud)

请记住,这种方法仍不能发现多次出现string在同一行.


Mit*_*tel 5

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

给出文件名的命令行:

grep -oci string * | grep -v :0
Run Code Online (Sandbox Code Playgroud)

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

grep -ochi string *
Run Code Online (Sandbox Code Playgroud)


小智 5

递归变体:

find . -type f -exec cat {} + | grep -c 'string'
Run Code Online (Sandbox Code Playgroud)