2016-06-11 2 views
2

Ich habe eine Logger-Datei wie folgt zu zählen:eine Log-Datei lesen zu verschiedenen Bereichen zu extrahieren und das Auftreten

2016-06-11 07:34:01.542 98459 [Thread-23-Job-parser-bolt] INFO JobLoader c.t.commerce.common.utils.APIUtils - Enrichment data updated successful for partnumber : 13794017 with status : 201 
2016-06-11 07:34:01.542 98459 [Thread-23-Job-parser-bolt] INFO JobLoader c.t.commerce.common.utils.APIUtils - Enrichment data updated successful for partnumber : 13794017 with status : 201 
2016-06-11 07:34:01.542 98459 [Thread-23-Job-parser-bolt] INFO JobLoader c.t.commerce.common.utils.APIUtils - Enrichment data updated successful for partnumber : 13794017 with status : 201 
2016-06-11 07:34:01.542 98459 [Thread-23-Job-parser-bolt] INFO JobLoader c.t.c.w.b.JobParserBolt - execute() 13794017 itemStatus itemsProcessed=1, itemsUpdated=1, timeTaken=1.808 sec 
2016-06-11 07:34:01.542 98459 [Thread-23-Job-parser-bolt] INFO JobLoader c.t.c.w.b.JobParserBolt - execute() 13794017 itemStatus itemsProcessed=1, itemsUpdated=1, timeTaken=1.808 sec 
2016-06-11 07:34:01.542 98459 [Thread-23-Job-parser-bolt] INFO JobLoader c.t.c.w.b.JobParserBolt - execute() 13794017 itemStatus itemsProcessed=1, itemsUpdated=1, timeTaken=1.808 sec 
2016-06-11 07:34:01.542 98459 [Thread-23-Job-parser-bolt] INFO JobLoader c.t.c.w.b.JobParserBolt - execute() Scene7 update for 13794017 itemStatus itemsProcessed=1, itemsUpdated=1, timeTaken= 
2016-06-11 07:34:01.542 98459 [Thread-23-Job-parser-bolt] INFO JobLoader c.t.c.w.b.JobParserBolt - execute() Scene7 update for 13794017 itemStatus itemsProcessed=1, itemsUpdated=1, timeTaken= 
2016-06-11 07:34:01.542 98459 [Thread-23-Job-parser-bolt] INFO JobLoader c.t.c.w.b.JobParserBolt - execute() Scene7 update for 13794017 itemStatus itemsProcessed=1, itemsUpdated=1, timeTaken= 
2016-06-11 07:34:01.543 98460 [Thread-23-Job-parser-bolt] INFO JobLoader c.t.c.w.b.JobParserBolt - execute EXIT 
2016-06-11 07:34:01.543 98460 [Thread-23-Job-parser-bolt] INFO JobLoader c.t.c.w.b.JobParserBolt - execute EXIT 
2016-06-11 07:34:01.543 98460 [Thread-23-Job-parser-bolt] INFO JobLoader c.t.c.w.b.JobParserBolt - execute EXIT 
2016-06-11 07:34:01.542 98459 [Thread-23-Job-parser-bolt] INFO JobLoader c.t.commerce.common.utils.APIUtils - Enrichment data updated successful for partnumber : 17696532 with status : 500 
2016-06-11 07:34:01.542 98459 [Thread-23-Job-parser-bolt] INFO JobLoader c.t.commerce.common.utils.APIUtils - Enrichment data updated successful for partnumber : 17696532 with status : 500 
2016-06-11 07:34:01.542 98459 [Thread-23-Job-parser-bolt] INFO JobLoader c.t.commerce.common.utils.APIUtils - Enrichment data updated successful for partnumber : 17696532 with status : 500 
2016-06-11 07:34:01.542 98459 [Thread-23-Job-parser-bolt] INFO JobLoader c.t.c.w.b.JobParserBolt - execute() 17696532 itemStatus itemsProcessed=1, itemsUpdated=1, timeTaken=1.808 sec 
2016-06-11 07:34:01.542 98459 [Thread-23-Job-parser-bolt] INFO JobLoader c.t.c.w.b.JobParserBolt - execute() 17696532 itemStatus itemsProcessed=1, itemsUpdated=1, timeTaken=1.808 sec 
2016-06-11 07:34:01.542 98459 [Thread-23-Job-parser-bolt] INFO JobLoader c.t.c.w.b.JobParserBolt - execute() 17696532 itemStatus itemsProcessed=1, itemsUpdated=1, timeTaken=1.808 sec 
2016-06-11 07:34:01.542 98459 [Thread-23-Job-parser-bolt] INFO JobLoader c.t.c.w.b.JobParserBolt - execute() Scene7 update for 17696532 itemStatus itemsProcessed=1, itemsUpdated=1, timeTaken= 
2016-06-11 07:34:01.542 98459 [Thread-23-Job-parser-bolt] INFO JobLoader c.t.c.w.b.JobParserBolt - execute() Scene7 update for 17696532 itemStatus itemsProcessed=1, itemsUpdated=1, timeTaken= 
2016-06-11 07:34:01.542 98459 [Thread-23-Job-parser-bolt] INFO JobLoader c.t.c.w.b.JobParserBolt - execute() Scene7 update for 17696532 itemStatus itemsProcessed=1, itemsUpdated=1, timeTaken= 
2016-06-11 07:34:01.543 98460 [Thread-23-Job-parser-bolt] INFO JobLoader c.t.c.w.b.JobParserBolt - execute EXIT 
2016-06-11 07:34:01.543 98460 [Thread-23-Job-parser-bolt] INFO JobLoader c.t.c.w.b.JobParserBolt - execute EXIT 
2016-06-11 07:34:01.543 98460 [Thread-23-Job-parser-bolt] INFO JobLoader c.t.c.w.b.JobParserBolt - execute EXIT 

Es ist eine Wiederholung von Hunderten solcher Protokolle mit unterschiedlichen Teilenummern und Statuscodes. Ich möchte die eindeutigen Teilenummern mit anderen Statuscodes als 201 in einer separaten Datei speichern, damit wir sie problemlos überwachen können. Obwohl ich gerne alle 201 Erfolgsposten zählen würde. So wird die Beispielausgabe, die ich von dieser möchte, sollte wie folgt aussehen:

No. of partnumbers with Status 201: 1 
Partnumbers with Status 500: 17696532, ... , ... 
Partnumbers with Status 401: ... ,... 

I awk zuerst verwendet, aber dann ist das Parsen nicht so einfach. Beachten Sie auch, dass die gleiche Teilenummer mehrmals angezeigt wird. Wie kann ich einen Scheck hinzufügen, so dass ich eine einzelne Teilenummer nicht mehr als einmal zähle.

My-Code bis jetzt:

awk -F'Enrichment data updated successful for partnumber :' '{print $2}' file.log |rev | cut -c 4- | rev 

Ich wollte die Teilenummer zuerst so extrahieren, aber ich bin nicht in der Lage, die Kontrolle anwenden mehr Teilenummern Problem zu vermeiden und in Beziehung mit ihrem Statuscode ist entspricht.

Antwort

2

Hier ist das Problem mit awk gelöst. Siehe die Inline-Kommentare für die Erklärung.

awk '/Enrichment data updated successful for partnumber/ { 
    # store the results as a multidimensional array with the first key 
    # being the status and the key of the second array being the product 
    # number. This removes duplicates because array keys must be unique 
    arr[$NF][$16]++ 
} 
END { 
    # iterate over the 201 status items and count them 
    for (item in arr[201]) { 
     count++ 
    } 
    print "No. of partnumbers with Status 201: " count 

    # iterate over the status array 
    for (status in arr) { 
     # skip 201 status 
     if (status == 201) 
      continue 
     # join the array by "," for printing 
     # taken from http://stackoverflow.com/a/13648609/1032785 
     joined = sep = "" 
     for (product in arr[status]) { 
      joined = joined sep product 
      sep = "," 
     } 

     print "Partnumbers with Status " status ": " joined 
    } 
} 
' foo.log 

Dies erzeugt die folgende Ausgabe mit Ihrer Beispielprotokolldatei, die ich einige zusätzliche Zeilen hinzugefügt:

No. of partnumbers with Status 201: 1 
Partnumbers with Status 401: 17623039 
Partnumbers with Status 500: 17696532, 17696539 
+1

Sie sollten erwähnen, dass GNU awk für echte mehrdimensionale Arrays erfordert. –

+0

@jordanm wollte nur wissen, was ist NF in arr [$ NF]? –

+0

@jordanm, Was ist, wenn ich habe 2016-06-11 07: 34: 01.542 98459 [Thread-23-Job-Parser-Schraube] INFO JobLoader ctcommerce.common.utils.APIUtils - Anreicherung Daten erfolgreich für Teilenummer aktualisiert: 17696532 mit Status: 503 Service nicht verfügbar, kann ich dann NF oder $ 20 verwenden? –

0

Non- awk, mit datamash und pee:

echo -n "No. of partnumbers with Status 201: " ; \ 
grep "status : " file.log | pee \ 
    'grep ": 201" | datamash -W -s countunique 16' \ 
    'grep -v ": 201" | datamash -W -s -g20 unique 16 | \ 
     sed "s/^[0-9]*/Partnumbers with Status &:/;s/,/, /g"' 

Ausgabe , (unter Verwendung von Probendaten von OP):

No. of partnumbers with Status 201: 1 
Partnumbers with Status 500: 17696532 
Verwandte Themen