
Ich habe eine Datei, die das Firewall-Protokoll wie folgt enthält:
Feb 3 0:18:51 17.1.1.1 id=firewall sn=qasasdasd "time=""2018-02-03" 22:47:55 "UTC""" fw=111.111.111.111 pri=6 c=2644 m=88 "msg=""Connection" "Opened""" app=2 n=2437 src=12.1.1.11:49894:X0 dst=4.2.2.2:53:X1 dstMac=42:16:1b:af:8e:e1 proto=udp/dns sent=83 "rule=""5" "(LAN->WAN)"""
Ich muss eine Ausgabe erhalten, die wie folgt aussehen sollte:
src=ipaddress:port , dst=ipaddress:port , proto=udp/dns
Insbesondere für die obige Eingabe:
src=12.1.1.11:49894,dst=4.2.2.2:53,proto=udp/dns
Ich habe es versucht
cat logfile.txt | awk '{ print $18" "$19" "$21 }'
aber das Ergebnis scheint von meinen Erwartungen abzuweichen.
Antwort1
Verwendung von grep
:
$ grep -o '\(src\|dst\)=[^:]\+:[^:]\+\|proto=[^ ]\+' logfile.txt
src=12.1.1.11:49894
dst=4.2.2.2:53
proto=udp/dns
Beschreibung:
'\(src\|dst\)=
übereinstimmensrc
oderdst
gefolgt von=
[^:]\+:[^:]\+
ein oder mehrere Zeichen, die kein Doppelpunkt sind, gefolgt von:
, gefolgt von einem oder mehreren Zeichen, die kein Doppelpunkt sind\|
oderproto=[^ ]\+'
Übereinstimmungproto=
, gefolgt von einem oder mehreren Zeichen, die kein Leerzeichen sind
Wir können die Zeilenumbrüche wie folgt zusammenkleben paste
:
$ grep -o '\(src\|dst\)=[^:]\+:[^:]\+\|proto=[^ ]\+' logfile.txt | paste -s -d,
src=12.1.1.11:49894,dst=4.2.2.2:53,proto=udp/dns
Antwort2
Basierend auf dem, was Sie haben:
awk '{print $18,$19,$21}' OFS=" , " logfile.txt | sed 's|:X[0-1]||g'
Sie brauchen es nicht, cat
da awk
es bereits in stdout schreibt. Der obige Befehl druckt diese Felder durch ein Leerzeichen getrennt aus, was das Komma tut, und setzt dann den Feldtrenner als Komma, umgeben von Leerzeichen, und verwendet sed
zum Entfernen :X0
und :X1
.
Die Ausgabe:
src=12.1.1.11:49894 , dst=4.2.2.2:53 , proto=udp/dns