
У меня есть файл, содержащий журнал брандмауэра, подобный этому:
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