如何grep唯一出现次数

时间:2013-09-11 22:37:48

标签: bash awk grep

我知道grep -c string可用于计算给定字符串的出现次数。我想要做的是计算只有部分字符串已知或保持不变时唯一出现的次数。

例如,如果我有一个文件(在本例中是一个日志),其中有几行包含一个常量字符串和一个重复变量,如下所示:

string=value1
string=value1
string=value1
string=value2
string=value3
string=value2

我希望能够识别每个唯一集合的编号,其输出类似于以下内容:(理想情况下使用单个grep / awk字符串)

value1 = 3 occurrences
value2 = 2 occurrences
value3 = 1 occurrences

有没有人使用grep或awk可能有效的解决方案?提前谢谢!

3 个答案:

答案 0 :(得分:17)

这非常有效...感谢大家的评论!

grep -oP "wwn=[^,]*" path/to/file | sort | uniq -c

答案 1 :(得分:4)

一般来说,如果你想要grep并跟踪结果,最好使用awk,因为它使用非常简单的语法以清晰的方式执行这些操作。

因此,对于您给定的文件,我会使用:

$ awk -F= '/string=/ {count[$2]++} END {for (i in count) print i, count[i]}' file
value1 3
value2 2
value3 1

这是做什么的?

  • -F=
    将字段分隔符设置为=,以便我们可以计算它的右侧和左侧部分。
  • /string=/ {count[$2]++}
    当找到模式“string =”时,检查它!这使用数组count[]来跟踪到目前为止第二个字段出现的时间。
  • END {for (i in count) print i, count[i]}
    最后,循环结果并打印出来。

答案 2 :(得分:1)

这是一个awk脚本:

#!/usr/bin/awk -f

BEGIN {
    file = ARGV[1]
    while ((getline line < file) > 0) {
        for (i = 2; i < ARGC; ++i) {
            p = ARGV[i]
            if (line ~ p) {
                a[p] += !a[p, line]++
            }
        }
    }
    for (i = 2; i < ARGC; ++i) {
        p = ARGV[i]
        printf("%s = %d occurrences\n", p, a[p])
    }
    exit
}

示例:

awk -f script.awk somefile ab sh

输出:

ab = 7 occurrences
sh = 2 occurrences