2 Stimmen

Wie man mehrere Parameter aus einem String mit sed oder awk extrahiert

Ich habe eine Protokolldatei, die so aussieht:

2010/01/12/ 12:00 einige irrelevante alapha 129495 und der interessante Wert 45pts
2010/01/12/ 15:00 einige irrelevante alapha 129495 und kein interessanter Wert
2010/01/13/ 09:00 einige irrelevante alapha 345678 und der interessante Wert 60pts

Ich möchte die Datum-Zeit-Zeichenfolge vs. interessanten Wert mit gnuplot plotten. Um das zu tun, versuche ich die obige Protokolldatei in eine CSV-Datei zu parsen, die wie folgt aussieht (nicht alle Zeilen im Protokoll haben einen plottbaren Wert):

2010/01/12/ 12:00, 45

2010/01/13/ 14:00, 60

Wie kann ich das mit sed oder awk machen?

Ich kann die Anfangszeichenfolgen extrahieren, so etwas wie:

cat partial.log | sed -e 's/^\(.\{17\}\).*/\1/' 

aber wie kann ich die Endwerte extrahieren?

Ich habe versucht, dies zu tun, leider ohne Erfolg!

Vielen Dank

0voto

Peter.O Punkte 6346

sed kann lesbarer gemacht werden:

nn='[0-9]+'
n6='[0-9]{6}'
n4='[0-9]{4}'
n2='[0-9]{2}'
rx="^($n4/$n2/$n2/ $n2:$n2) .+ $n6 .+ ($nn)pts$"

sed -nre "s|$rx|\1 \2|p" file 

Ausgabe

2010/01/12/ 12:00 45
2010/01/13/ 09:00 60

0voto

Michael J. Barber Punkte 23764

Ich würde das in zwei Pipeline-Stufen machen, zuerst awk dann sed:

awk '$NF ~ /[[:digit:]]+pts/ { print $1, $2", "$NF }' | 
  sed 's/pts$//'

Indem Sie $NF anstelle einer festen Zahl verwenden, arbeiten Sie mit dem letzten Feld, unabhhängig davon, wie der nicht zusammenhängende Text aussieht und wie viele Felder er einnimmt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X