2016-12-12 4 views
1

Ich habe den folgenden Inhalt aus data.log-Datei. Ich möchte den Zeitwert und einen Teil der Nutzlast extrahieren (nach dem Tod in der Nutzlast, dritte Reihe, beginnend vor dem letzten Byte. Bitte beachten Sie die erwartete Ausgabe).Entfernen der Punkte und Doppelpunkte im Zeitfeld

DATA.LOG

print 1: file offset 0x0 
ts=0x584819041ff529e0 2016-12-07 14:13:24.124834649 UTC 
type: ERF Ethernet 
dserror=0 rxerror=0 trunc=0 vlen=0 iface=1 rlen=96 lctr=0 wlen=68 
pad=0x00 offset=0x00 
dst=aa:bb:cc:dd:ee:ff src=ca:fe:ba:be:ca:fe 
etype=0x0800 
45 00 00 32 00 00 40 00 40 11 50 ff c0 a8 34 35   [email protected]@.P...45 
c0 a8 34 36 80 01 00 00 00 1e 00 00 08 08 08 08   ..46............ 
08 08 50 e6 61 c3 85 21 01 00 de ad be ef 85 d7   ..P.a..!........ 
91 21 6f 9a 32 94 fd 07 01 00 de ad be ef 85 d7   .!o.2........... 


print 2: file offset 0x60 
ts=0x584819041ff52b00 2016-12-07 14:13:24.124834716 UTC 
type: ERF Ethernet 
dserror=0 rxerror=0 trunc=0 vlen=0 iface=1 rlen=96 lctr=0 wlen=68 
pad=0x00 offset=0x00 
dst=aa:bb:cc:dd:ee:ff src=ca:fe:ba:be:ca:fe 
etype=0x0800 
45 00 00 32 00 00 40 00 40 11 50 ff c0 a8 34 35   [email protected]@.P...45 
c0 a8 34 36 80 01 00 00 00 1e 00 00 08 08 08 08   ..46............ 
08 08 68 e7 61 c3 85 21 01 00 de ad be ef 86 d7   ..h.a..!........ 
91 21 c5 34 77 bd fd 07 01 00 de ad be ef 86 d7   .!.4w........... 

Erwartete Ausgabe

Ich möchte nur die Punkte und Doppelpunkte im Zeitfeld ersetzen (vor UTC) und den gesamten Wert.

141324124834649,85d79121 
141324124834716,86d79121 

Was ich bisher Ich habe die Felder nach extrahiert getan haben „“ aber nicht sicher, wie man die Doppelpunkte ersetzt und den gesamten Zeitwert erhält.

awk -F '[= ]' '$NF == "UTC"{split($4,b,".");s=b[2]",";a=15} /de ad be ef/{s=s $a $(a+1);if(a==1)print s;a=1}' data.log 

124834649,85d79121 
124834716,86d79121 

Jede Hilfe wird sehr geschätzt.

Antwort

4
awk '$NF == "UTC"{gsub("[.:]","",$3);s=$3",";a=15} /de ad be ef/{s=s $a $(a+1);if(a==1)print s;a=1}' data.log 

Ergebnis:

141324124834649,85d79121 
141324124834716,86d79121 

PS: es kann mit getline vereinfacht werden:

awk '$NF == "UTC"{gsub("[.:]","",$3);s=$3","} /de ad be ef/{s=s $15 $16;getline;print(s $1 $2)}' data.log 
2

Sie können die Zeit Teil wie folgt extrahieren:

$ awk '/UTC/ {split($0,a); gsub(/[\.:]/,"",a[3]); print a[3]}' file 
141324124834649 
141324124834716 
1

für die UTC Teil, (der Rest des Codes ist der gleiche

awk '/UTC$/{gsub(/[\.:]/,"");print $3}' YourFile 
  • entfernen Sie einfach das „:“ „“ und und nehmen Sie den Feldwert, anderen Teil der Linie nicht jene 2 Charakter haben, ist so nicht geändert
  • $ NF Test ersetzt von/UTC $ /, ein bisschen schneller und einfacher (OMHO)

der vollständige Code

awk -F '[= ]' '/UTC$/{gsub(/[\.:]/,"");s=$3",";a=15} /de ad be ef/{s=s $a $(a+1);if(a==1)print s;a=1}' YourFile 
Verwandte Themen