grep 计数多次出现

719*_*016 8 bash grep

是否可以在一个命令中对文件中的多次出现进行 grep 计数?例如:

$ cat > file
blah alfa
beta blah
blah blahgamma
gamma
Run Code Online (Sandbox Code Playgroud)

我可以:

grep -c 'alfa' file 
1 
grep -c 'beta' file  
1
grep -c 'gamma' file  
2
Run Code Online (Sandbox Code Playgroud)

但是有可能像这样:

grep -c -e 'alfa' -e 'beta' -e 'gamma' -somemoreblackmagic file
Run Code Online (Sandbox Code Playgroud)

并获得每个人的计数?

alfa 1
beta 1
gamma 2
Run Code Online (Sandbox Code Playgroud)

小智 6

您只需使用grepsortuniq即可获得所需的内容。

grep -EIho 'alfa|beta|gamma' *|sort|uniq -c
Run Code Online (Sandbox Code Playgroud)


spa*_*kie 3

我不认为 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]])
}
'
Run Code Online (Sandbox Code Playgroud)

只需将搜索字符串直接提供给脚本即可

[编辑]
具有正则表达式支持的固定版本(请参阅下面的评论)。请告诉我是否还有任何未解决的问题。

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

示例用法:

script_name -c alfa -c beta -c gamma << !
alfa
beta
gamma
gamma
!
Run Code Online (Sandbox Code Playgroud)

给出:

alfa 1
beta 1
gamma 2
Run Code Online (Sandbox Code Playgroud)

正则表达式用法:

script_name -c   "^al"    -c "beta" -c gamma -c "m.$" << !
alfa
beta
gamma
gamma
!
Run Code Online (Sandbox Code Playgroud)

给出:

^al 1
beta 1
gamma 2
m.$ 2
Run Code Online (Sandbox Code Playgroud)

[/编辑]