2016-08-31 30 views
2

Ich habe eine Datei mit Zeilen wie untenParsing Strings entweder grep, awk oder sed

17:59:49.987 - JobID 864563: Found 7 clips from SeqID 862753 
17:59:49.987 - Processing Job 864562 
17:59:50.003 - JobID 864561: Location 14695 applied clip data successfully. Updating OCAMT_GM_Sent 
17:59:50.003 - Processing Job 864563 
17:59:50.003 - JobID 864564 
17:59:50.018 - JobID 864565 
17:59:50.034 - Processing Job 864565 
17:59:50.034 - JobID 864566 
17:59:50.034 - JobID 864562 
17:59:50.034 - JobID 864563 
17:59:50.034 - Processing Job 864566 
17:59:50.049 - JobID 864567 
17:59:50.049 - JobID 864564 
17:59:50.049 - Trying to send JobID 864566 to location 14623 at http://172.28.48.11/yb/ClipData.php. Retry count 0 
17:59:50.049 - Processing Job 864567 

mit Ich mag würde bestimmte Zeichenfolgen erfassen, so dass seine Ausgabedatei so etwas wie unten ist;

864563 17:59:49.987 
864562 17:59:49.987 
864561 17:59:50.003 
864563 17:59:50.003 

Seit der Job-ID Länge ist variabel I regulären Ausdruck der Verwendung von \ d + und brechen die Linie in der Mitte mit dem Wort Job als Feldtrenn denke, aber ich bin nicht sicher, ob die folgenden kombiniert werden können;

awk -F'Job*' '{print $1}'|awk '{print $1}' 
awk -F'Job*' '{print $2}' 
+4

[Bearbeiten] Ihre Frage so die gezeigt erwartete Ausgabe ausgegeben wird Sie von der Probeneingang gezeigt bekommen würde, nicht ausgegeben von einigen anderen Eingabeset. Wir brauchen etwas, gegen das wir eine mögliche Lösung testen können, um zu sehen, ob es die erwartete Ausgabe produziert. –

+0

@Ed ich denke, meine Beispiel-Ausgabedatei erwähnt, die Werte, die von der Eingabe entfernt werden können. Ich habe Probleme, die anderen Zeichenfolgen aus der Eingabedatei – Dren

+0

@Dren zu ignorieren, auf welcher Grundlage möchten Sie die Ausgabe .. sowohl Job und JobID oder nur einer von ihnen .. wird jede Zeile der Eingabe dieses Schlüsselwort enthalten? – Sundeep

Antwort

3

sed Version:

sed -e 's/\([^ ]*\).*Job\(ID\)\? \([0-9]\+\).*/\3 \1/g' 

oder mit erweiterten Reguläre Ausdrücke wie @spasic wies darauf hin:

sed -E 's/^(\S+).*Job(ID)? ([0-9]+).*/\3 \1/' 
+0

getestet und es hat funktioniert. Cheers mate – Dren

+0

'Job' oder' JobID' kann auch als 'Job \ (\ | ID \)' .. mit erweiterten Regex, 'sed -E '/^(\ S +) angegeben werden. * Job (| ID) ([0-9] +). */\ 3 \ 1/'' – Sundeep

+1

' Job' oder 'JobID' ist' Job (ID)? 'Geschrieben. Was Sie haben, 'Job (| ID)', ist undefiniertes Verhalten nach dem [POSIX-Standard] (http://pubs.opengroup.org/onlinepubs/009696899/basedefs/xbd_chap09.html#tag_09_04_03) ("** A vertical -line erscheint ** als erstes oder letztes in einem ERE oder ** unmittelbar nach ** einer vertikalen Linie oder ** einer linken Klammer ** oder unmittelbar vor einer rechten Klammer ** erzeugt unbestimmte Ergebnisse. **) –

3

aus Ihre Kommentare, gehe ich davon aus Ihr so ​​etwas wie dieses awk

awk -F'[ ]+-.*Job(ID)? |:[ ]+|[ ]+' '{print $2, $1}' file 

Ausgabe mit

erwarten:

864563 17:59:49.987 
864562 17:59:49.987 
864561 17:59:50.003 
864563 17:59:50.003 
864564 17:59:50.003 
864565 17:59:50.018 
864565 17:59:50.034 
864566 17:59:50.034 
864562 17:59:50.034 
864563 17:59:50.034 
864566 17:59:50.034 
864567 17:59:50.049 
864564 17:59:50.049 
864566 17:59:50.049 
864567 17:59:50.049 
+0

IMO 'Job [ID] *' sollte in 'Job (ID) geändert werden? ' – anishsane

+0

@Chet getestet und es funktioniert..cheers Mate. – Dren

Verwandte Themen