Журналы брандмауэра Grep Syslog

Журналы брандмауэра Grep Syslog

У меня есть файл, содержащий журнал брандмауэра, подобный этому:

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)"""

Мне нужно получить вывод, который должен быть таким:

src=ipaddress:port , dst=ipaddress:port , proto=udp/dns

В частности, для вышеуказанного ввода,

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

Я пытался

cat logfile.txt | awk '{ print $18" "$19" "$21 }'

но результат, похоже, отличается от того, что я ожидал.

решение1

С использованием grep:

$ grep -o '\(src\|dst\)=[^:]\+:[^:]\+\|proto=[^ ]\+' logfile.txt
src=12.1.1.11:49894
dst=4.2.2.2:53
proto=udp/dns

Описание:

  • '\(src\|dst\)=совпадать srcили dstсопровождаться=
  • [^:]\+:[^:]\+один или несколько символов, кроме двоеточия, за которыми следует :, за которым следует один или несколько символов, кроме двоеточия
  • \|или
  • proto=[^ ]\+'за совпадением proto=следует один или несколько непробельных символов

Мы можем склеить новые строки с помощью 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

решение2

Исходя из того, что у вас есть:

awk '{print $18,$19,$21}' OFS=" , " logfile.txt | sed 's|:X[0-1]||g'

Вам не нужно, catтак как awkуже пишет в stdout. Команда выше выводит эти поля, разделенные пробелом, что и делает запятая, а затем устанавливает разделитель полей в виде запятой, окруженной пробелами, и использует sedдля удаления :X0и :X1.

Выход:

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

Связанный контент