一致/不一致パターンの数を印刷する方法と複数のパターンを線で区切って印刷する方法

一致/不一致パターンの数を印刷する方法と複数のパターンを線で区切って印刷する方法

一致/不一致パターンの数を印刷する方法と、複数のパターンを線で区切って印刷する方法です。

入力例(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つのエントリがまったくないことを示すために印刷されません。

希望の出力:

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];
    }
}

関連情報