9

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 を使用して機能するソリューションを誰かが持っていますか? 前もって感謝します!

4

3 に答える 3

25

これは完璧に機能しました...コメントをくださった皆さん、ありがとうございます!

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

于 2013-09-18T14:38:04.880 に答える
6

一般に、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[]して、2 番目のフィールドがこれまでに出現した回数を追跡します。
  • END {for (i in count) print i, count[i]}
    最後に、結果をループして出力します。
于 2016-08-18T09:45:12.273 に答える
2

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
于 2013-09-11T23:20:42.487 に答える