grep 计数多次出现

grep 计数多次出现

是否可以使用一个命令来对文件中的多个出现次数进行 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

相关内容