So drucken Sie die Anzahl der übereinstimmenden/nicht übereinstimmenden Muster und drucken mehrere Muster zeilenweise getrennt

So drucken Sie die Anzahl der übereinstimmenden/nicht übereinstimmenden Muster und drucken mehrere Muster zeilenweise getrennt

So drucken Sie die Anzahl der übereinstimmenden/nicht übereinstimmenden Muster und drucken mehrere Muster zeilenweise getrennt.

Eingabebeispiel ( 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

Gewünschte Ausgabe:

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
==========================================

was ich bisher versucht habe:

  1. um die Anzahl der Zeilen zu erhalten:egrep -o '8888|3333|5555' test.log | sort| uniq -c

Ausgabe:

4 3333
2 8888

aber es wird nicht gedruckt, 0 5555um anzuzeigen, dass in der Datei test.log kein Vorkommen von fünf vorhanden ist

gewünschte Ausgabe:

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

Dadurch wird die Ausgabe in alphabetischer Reihenfolge sortiert und nicht entsprechend der von mir erwarteten Ausgabe, wie unten gezeigt:

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
==========================================

Antwort1

Das Programm, das Sie suchen und das problemlos das tun kann, was Sie wollen, heißt awk. :-)

Es kann programmierte Aktionen für übereinstimmende RE-Muster ausführen.

Ungetestetes, vereinfachtes, auswendig gelerntes Beispielprogramm awk, das mit Ihren Beispieleingaben und angegebenen Mustern funktionieren sollte:

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

verwandte Informationen