연습 문제로 awk에서 문제를 해결하려고하는데 문제가 있습니다. awk (또는 gawk)가 모든 고유 한 소스 IP 주소의 고유 한 대상 포트를 인쇄 할 수있게하려고합니다.
원본 IP 주소는 필드 1 ($ 1)이고 대상 포트는 필드 4 ($ 4)입니다.awk : 동 Log (conn.log)에서 각 소스 IP에 대해 표시되는 대상 포트 목록을 만듭니다.
Cut for brevity:
SourceIP SrcPort DstIP DstPort
192.168.1.195 59508 98.129.121.199 80
192.168.1.87 64802 192.168.1.2 53
10.1.1.1 41170 199.253.249.63 53
10.1.1.1 62281 204.14.233.9 443
각 소스 IP를 인덱스에 배열로 저장한다고 생각합니다. 그러나 목적지 포트를 값으로 저장하는 방법에 대해서는 잘 모르겠습니다. 어쩌면 인덱스의 값인 문자열에 계속 추가 할 수 있습니다. "80", ... "80,443"... 각 경기마다. 그러나 아마도 이것이 최선의 해결책은 아닙니다.
나는 출력에 너무 신경 쓰지 않고, awk에서 어떻게 접근 할 수 있는지보고 싶다. 비록, 출력을 위해 나는
awk '{ if (NR == 1) next; arr[$1,$4] = $4 } END { for (i in arr) print arr[i] }' infile
,
Source IP:dstport, dstport, dstport
192.168.1.195:80,443,8088,5900
나는이 같은 땜질하고있어, 같은 것을 생각하지만, 2 차원의 요소와 그 값을 출력하는 방법을 알아낼 수 없습니다 차원 배열. 각 포트가 요소의 값을 덮어 쓰고 있기 때문에이 행을 따라 무언가가 고유 한 대상 포트 작업을 처리하는 것 같습니다.
참고 :awk/gawk 해결 방법이 있습니다.
해결책 EDIT : 내 질문에서 언급 한 고유 대상 포트를 인쇄하고 열 머리글 행을 건너 뛰기 위해 Kent 솔루션을 약간 수정했습니다.
awk '{ if (NR == 1) next ; if (a[$1] && a[$1] !~ $4) a[$1] = a[$1]","$4; else a[$1] = $4 } END {for(x in a)print x":"a[x]}'
켄트, 예제의 첫 부분, 즉 END 이전의 모든 것을 신중하게 설명 할 수 있습니까? 감사. – jonschipp
+1. 나는 두 번 지나서 생각하고 있었다. 그러나 이것은 너무 달콤하다! –
@jonschipp 설명에 대한 편집을 참조하십시오 – Kent