我有一堆日志文件。我需要找出一个字符串在所有文件中出现的次数。
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。)
我有一堆日志文件。我需要找出一个字符串在所有文件中出现的次数。
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。)
这适用于每行出现多次的情况:
grep -o string * | wc -l
grep -o string * --exclude-dir=some/dir/one/ --exclude-dir=some/dir/two | wc -l
。 - a codergrep -ioR string * | wc -l
来进行大小写不敏感、递归、仅匹配搜索的操作。 - LeonardChallisgrep -rc test . | awk -F: '$NF > 0 {x+=$NF; $NF=""; print} END{print "Total:",x}'
。 - Yaroncat * | grep -c string
grep -c string<*
,所以只需要用小于号取代空格。 - JamesM-SiteGengrep -o
和wc -l
则可以。但是像原始问题那样,使用cat会更快。 - Leagsaidh Gordongit grep
不起作用,因为它没有 -o
,但是 git grep <word> | grep -c <word>
可以。就像被接受的答案一样,在一行中有多个出现的情况下是不准确的。git grep <word> | grep -o <word> | wc -l
将涵盖该情况。 - eggsyntaxgrep -oh string * | wc -w
将在一行中计算多个出现次数
不要使用-c,只需将其管道传递给wc -l。
grep string * | wc -l
以下代码会将每个出现的字符串单独列为一行,并统计行数。
但是,如果一个字符串在同一行中出现了两次及以上,则不会被计算。
cat * | grep -c string
cat
的罕见有用应用之一。
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
你可以添加-R
进行递归搜索(避免使用cat),并添加-I
以忽略二进制文件。
grep -RIc string .
必不可少的 AWK 解决方案:
grep -c string * | awk 'BEGIN{FS=":"}{x+=$2}END{print x}'
如果您的文件名包含 ":",请小心处理。
与之前所有答案不同的是:
perl -lne '$count++ for m/<pattern>/g;END{print $count}' *
下面是一种处理包括冒号在内的文件名的 AWK 解决方案:
grep -c string * | sed -r 's/^.*://' | awk 'BEGIN{}{x+=$1}END{print x}'
请记住,这种方法仍然不能在同一行上找到多个string
的出现。
grep file1 file2 --options
- Dnyaneshwar Harer