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'

이미 stdout에 쓰기 cat때문에 필요하지 않습니다 . awk위의 명령은 공백으로 구분된 필드를 인쇄한 다음 필드 구분 기호를 공백으로 둘러싸인 쉼표로 설정하고 및 를 sed제거하는 데 사용합니다 .:X0:X1

출력:

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

관련 정보