演習として awk で問題を解決しようとしていますが、問題が発生しています。awk (または gawk) が、特定の送信元 IP アドレスの一意の宛先ポートをすべて出力できるようにしたいと考えています。
ソース IP アドレスはフィールド 1 ($1) で、宛先ポートはフィールド 4 ($4) です。
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 でこれにどのようにアプローチできるかを知りたいだけです。とはいえ、出力については、次のようなことを考えていましたが、
Source IP:dstport, dstport, dstport
192.168.1.195:80,443,8088,5900
こんなものをいじっていますが、
awk '{ if ( NR == 1) next; arr[$1,$4] = $4 } END { for (i in arr) print arr[i] }' infile
しかし、2 次元配列の要素とその値を出力する方法がわかりません。各ポートが要素の値を上書きしているため、この行に沿った何かが一意の宛先ポートタスクを処理するようです。
注: awk/gawkソリューションで答えが得られます!
ソリューションの編集:私の質問で述べたように一意の宛先ポートを出力し、列のヘッダー行をスキップするようにケントのソリューションをわずかに変更しました。
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]}'