是否可以使用一个命令来对文件中的多个出现次数进行 grep 计数?例如:
$ cat > file
blah alfa
beta blah
blah blahgamma
gamma
我可以:
grep -c 'alfa' file
1
grep -c 'beta' file
1
grep -c 'gamma' file
2
但有可能这样做吗:
grep -c -e 'alfa' -e 'beta' -e 'gamma' -somemoreblackmagic file
并得到每一个的计数?
alfa 1
beta 1
gamma 2
答案1
我认为 grep 无法完成你想做的事情。
只需使用 awk 即可:-)
此解决方案可能不适用于大型文件(未优化)。并且仅适用于纯单词 - 不适用于正则表达式。但如果需要,可以轻松添加一些功能。
低端版本的限制概述如下:
awk '
{
split($0, b); for (i in b) ++A[b[i]]
}
END {
split("'"$*"'", a)
for (i in a) print sprintf("%s %d", a[i], A[a[i]])
}
'
只需将搜索字符串直接提供给脚本
[编辑]
修复了正则表达式支持的版本(见下面的评论)。如果还有任何未解决的问题,请告诉我。
# ---- my favorite ----
awk -F' ?-c ' '
BEGIN { split("'"$*"'", a) }
{ for (i = 2; a[i]; ++i) if (match($0, a[i])) ++A[i] }
END { for (i = 2; a[i]; ++i) if (A[i]) print a[i] " " A[i] }
'
# ---- my favorite ----
示例用法:
script_name -c alfa -c beta -c gamma << !
alfa
beta
gamma
gamma
!
给出:
alfa 1
beta 1
gamma 2
正则表达式用法:
script_name -c "^al" -c "beta" -c gamma -c "m.$" << !
alfa
beta
gamma
gamma
!
给出:
^al 1
beta 1
gamma 2
m.$ 2
[/编辑]
答案2
您只需使用即可获得所需的内容grep,种类和独特。
grep -EIho 'alfa|beta|gamma' *|sort|uniq -c
答案3
另一个awk
解决方案是使用 shell 脚本包装器:
/bin/sh – #! awk' BEGIN { split(“alfa beta gamma”, 关键字) for (i 在关键字中) count[关键字[i]]=0 } /阿尔法/ { 计数[“阿尔法”]++ } /beta/ { 计数["beta"]++ } /伽马/ { 计数[“伽马”]++ } 结尾 { for (i in 关键字) print 关键字[i], count[关键字[i]] }'
如果您希望能够在运行时选择搜索关键字(并将它们作为参数提供,如 sparkie 的答案中所述),则可以调整此脚本以awk
动态构建脚本。
答案4
Perl 解决方案:
perl -lne 'chomp;$s{$_}++ if /alpha|beta|gamma/ }{ print "$_ $s{$_}" for keys %s' file