一致したパターンと一致しなかったパターンの数を印刷し、複数のパターンを行で区切って印刷する方法

一致したパターンと一致しなかったパターンの数を印刷し、複数のパターンを行で区切って印刷する方法

一致したパターンと一致しないパターンの数を印刷する方法と、複数のパターンを行で区切って印刷する方法。

入力例(test.log):

This 23 line has eight 8888
This 11 line has three 3333
need 12 to separate eight and three 3333
eight 32 is greater than three 8888
three 13 is less than eight 3333
three 14 is printed more than eight 3333

望ましい出力:

8888:4
3333:2
5555:0
This 11 line has three 3333
need 12 to separate eight and three 3333
three 13 is less than eight 3333
three 14 is printed more than eight 3333
============================================
This 23 line has eight 8888
eight 32 is greater than three 8888
==========================================

これまで試したこと:

  1. 行数を取得するには:egrep -o '8888|3333|5555' test.log | sort| uniq -c

出力:

4 3333
2 8888

0 5555しかし、ファイル test.log に 5 が 0 回出現したことを示すために印刷されません。

希望する出力:

4 3333
2 8888
0 5555
  1. egrep '8888|3333' test.log | sort -V

このソート出力はアルファベット順に行われ、以下に示すように期待する出力には従いません。

This 11 line has three 3333
need 12 to separate eight and three 3333
three 13 is less than eight 3333
three 14 is printed more than eight 3333
============================================
This 23 line has eight 8888
eight 32 is greater than three 8888
==========================================

答え1

あなたが探している、あなたが望むことを簡単に実行できるプログラムは と呼ばれますawk。 :-)

一致した RE パターンに対してプログラムされたアクションを実行できます。

awkサンプル入力と指定されたパターンで動作する、テストされていない、簡略化された、暗記されたサンプルプログラム:

BEGIN {
    eights = 0;
    fives = 0;
    threes = 0;
}
/8888/ {
    eightln[eights] = $0;
    eights++;
}
/5555/ {
    fiveln[fives] = $0;
    fives++;
}
/3333/ {
    threeln[threes] = $0;
    threes++;
}
# ... and so on
END {
    printf("%d 8888\n", eights);
    printf("%d 5555\n", fives);
    printf("%d 3333\n", threes);
    for (i = 0; i < eights; i++) {
        print eightln[i];
    }
    print "=========="
    for (i = 0; i < fives; i++) {
        print fiveln[i];
    }
    print "=========="
    for (i = 0; i < threes; i++) {
        print threeln[i];
    }
}

関連情報