2012-04-04 1 views
0

Ich habe Protokolleinträge, die jeweils zwei Zeilen gepaart sind. Ich muss die erste Zeile analysieren, um eine Zahl zu extrahieren, um zu wissen, ob es größer als 5000 ist. Wenn diese Zahl größer als 5000 ist, muss ich die zweite Zeile zurückgeben, die auch analysiert wird, um eine ID abzurufen.Verwenden Sie Grep -A1, um einen Wert in der zweiten Zeile zurückzugeben, solange ein numerischer Wert in der ersten Zeile erfüllt ist

Ich weiß, wie man alle Informationen grep und es zu analysieren. Ich weiß nicht, wie man die Grep ignorieren Dinge, wenn sie weniger als einen bestimmten Wert sind. Beachten Sie, dass ich nicht verpflichtet bin, grep zu verwenden, wenn andere andere Mittel wie awk/sed ersetzt werden können.

Rohdaten (zwei Linien zum Beispiel Klarheit getrennt).

Das Ziel meiner grep ist die Nummer 5001 folgenden „Credits extrahiert =“ wenn diese mehr als 5000 ist dann will ich Nummer „12345“ zurück aus die zweite Zeile ---------- ----------------

2012-03-16T23:26:12.082358 0x214d000 DEBUG ClientExtractAttachmentsPlayerMailTask for envelope 22334455 finished: credits extracted = 5001, items extracted count = 0, status = 0. [Mail.heomega.mail.Mail](PlayerMailTasks.cpp:OnExtractAttachmentsResponse:944)  
2012-03-16T23:26:12.082384 0x214d000 DEBUG Mail Cache found cached mailbox for: 12345 [Mail.heomega.mail.Mail](MailCache.cpp:GetCachedMailbox:772) 

snippits ------------------------ -

- Finden Sie die Anzahl der Credits extrahiert, ohne Komma Lärm:

grep "credits extracted = " fileName.log | awk '{print $12}' | awk -F',' '{print $1}' 

- Finden Sie die ID der zweiten Zeile egal was der Wert der Kredite extrahiert ist:

grep -A1 "credits extracted = " fileName.log | grep "cached mailbox for" | awk -F, '{print $1}' | awk '{print $10}' 

- ‚Wenn‘ Aussage, die Logik als Symbol I erwerben müssen:

v_CredExtr=5001; v_ID=12345; if [ $v_Cred -gt 5000 ]; then echo $v_ID; fi; 
+0

beachten Sie, dass S.O. Posts verwenden 4 Leerzeichen am Anfang der Zeile, um "Codebeispiel" anzuzeigen. Ich habe Ihren Beitrag neu formatiert, um zu verdeutlichen, worauf sich Ihr ursprünglicher Text konzentrierte. Ich füge normalerweise nur Codeblöcke hinzu und repariere Absatzbrüche. Ich habe ein paar "-" herausgenommen (während ich andere hineinlasse), um ein leserlicheres Dokument zu machen. Wenn Sie dem nicht zustimmen, können Sie die Bearbeitung rückgängig machen oder Ihren Post mit der Bearbeitungs-Symbolleiste bearbeiten, die oben im Eingabefeld angezeigt wird. Im Grunde mausen Sie den Text, den Sie formatieren möchten, mit der Maus und klicken Sie auf das Werkzeug, um den gewünschten Effekt zu erzielen. d. h. "{}" für Code. Viel Glück. – shellter

+0

Denken Sie jetzt daran, Ihren Beitrag so zu bearbeiten, dass er das von Ihnen eingegebene Beispieldatenformat enthält. Dies ist höchstwahrscheinlich ein Einzeiler in awk, aber wir werden 20 Fragen spielen, bis wir die erforderliche Ausgabe sehen. Viel Glück. – shellter

+0

musste den obigen Kommentar bearbeiten, für die neueste Version aktualisieren ;-) Sorry. – shellter

Antwort

1

Sie alles mit einem einzigen AWK-Filter kann, glaube ich:

#!/usr/bin/awk -f 

/credits extracted =/ { 
    credits = substr($12, 1, length($12) - 1) + 0 
    if (credits > 5000) 
     show_id = 1 
    next 
} 

show_id == 1 { 
    print $10 
    show_id = 0 
} 

Offensichtlich Sie alle AWK-Skript in einem Shell-String in einem Skript stopfen kann, sogar mehrzeilig. Ich habe es hier zur Klarheit in einem eigenen Skript gezeigt.

S.S .: Bitte benachrichtigen, wenn es funktioniert ;-)

+0

Sie sind so toll !! Ich habe dieses Ding seit Tagen getreten und du hast Minuten gebraucht ?! Verblüffung. Vielen Dank. –

+0

Sie sollten definitiv lesen [die AWK Bibel] (http://plan9.bell-labs.com/cm/cs/awkbook/) und Sie werden erstaunt sein, wie nützlich AWK Textverarbeitung sein kann. – C2H5OH

+0

Danke für die Empfehlung. Ich habe es gerade in meinen Amazon-Warenkorb gelegt und mir ein Handbuch von der GNU-Seite genommen. Du hast ein Monster erschaffen! –

Verwandte Themen