awk, um einen Teil eines Feldes auszuschneiden und trotzdem die ganze Zeile zu drucken

awk, um einen Teil eines Feldes auszuschneiden und trotzdem die ganze Zeile zu drucken

Ich habe diese Zeile:

08:30:02.480507 IP 192.168.100.150.65119 > 192.168.100.151:53 59865 [1au] A? click.em.redbox.com. (48)

Ich muss die ".480507" aus dem Zeitstempel herausschneiden, damit die Zeile folgendermaßen aussieht:

08:30:02 IP 192.168.100.150.65119 > 192.168.100.151.53: 59865 [1au] A? click.em.redbox.com. (48)

Ich habe mit mehreren awk- und cut-Anweisungen herumprobiert, aber ohne Erfolg. Ich würde gerne einen awk-Einzeiler finden, aber sed ist dafür vielleicht eine bessere Lösung. Ich weiß einfach nicht genug über beides, wenn es um das Schneiden auf diese Weise geht.

HINWEIS: Dies ist ein Beispiel und der Teil des Zeitstempels, den ich ausschneiden muss, wird nicht derselbe sein, da ich diese Aktion für mehrere Zeilen mit unterschiedlichen Zeitstempeln ausführen muss.

Antwort1

Die awkwahrscheinlich einfachste Methode besteht darin, im ersten durch Leerzeichen getrennten Feld eine Ersetzung durch einen regulären Ausdruck durchzuführen und dabei alles vom Punkt bis zum Ende des Felds zu ersetzen:

awk '{sub(/\..*/,"",$1)}1' somefile

Antwort2

Ich würde awk verwenden

awk --posix '{ gsub(/\.[[:digit:]]{6}/, "", $1); print }' filename

Zielt auf das erste Feld (durch Leerzeichen getrennt), sucht nach einem ., gefolgt von 6 Zahlen, und leert es.

Antwort3

mit GNUsed

sed -r 's/^([^.]+)\.[0-9]+ /\1 /' filename
  • ^([^.]+)Erfassen Sie die Startzeichenfolge bis zum ersten Punktzeichen.
  • \.[0-9]+Übereinstimmung mit einem Punktzeichen, gefolgt von mehr als einer Ziffer

und wenn die Anzahl der Zeichen mit der im Beispiel angegebenen übereinstimmt,

sed -r 's/^(.{8}).{7} /\1 /' filename

verwandte Informationen