다음과 같은 방화벽 로그가 포함된 파일이 있습니다.
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'
그런 식으로 stdout에 쓸 필요는 없습니다 cat
. awk
위의 명령은 공백으로 구분된 필드(쉼표의 용도)를 인쇄한 다음 필드 구분 기호를 공백으로 둘러싸인 쉼표로 설정하고 및 를 sed
제거 하는 데 사용됩니다 .:X0
:X1
산출:
src=12.1.1.11:49894 , dst=4.2.2.2:53 , proto=udp/dns