Grep Syslog-Firewall-Protokolle

Grep Syslog-Firewall-Protokolle

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\)=übereinstimmen srcoder dstgefolgt von=
  • [^:]\+:[^:]\+ein oder mehrere Zeichen, die kein Doppelpunkt sind, gefolgt von :, gefolgt von einem oder mehreren Zeichen, die kein Doppelpunkt sind
  • \|oder
  • proto=[^ ]\+'Übereinstimmung proto=, 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, catda awkes 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 sedzum Entfernen :X0und :X1.

Die Ausgabe:

src=12.1.1.11:49894 , dst=4.2.2.2:53 , proto=udp/dns

verwandte Informationen