Ich habe eine Datei, die eine CIDR-Adresse und Port auf jeder Zeile enthält:Verwendung awk, CIDR Gruppe mit Ports und zählt alle Ports mit jeweiligen CIDR
192.168.1.0/24 3306
192.168.1.0/24 55982
10.10.10.0/24 5800
10.10.10.0/24 39690
10.10.10.0/24 50112
192.168.1.0/24 3308
192.168.1.0/24 3312
192.168.1.0/24 3316
Verwenden GNU Awk 4.1.4 (auf einem Linux-System), war die erste Idee, alle Ports auf einer Linie von CIDR Adresse gruppiert zu setzen, so dass dies tat es:
awk '{a[$1]=a[$1] ? a[$1]","$2 : $2} END {for (j in a) {print j" over ports: "a[j]}}' file
192.168.1.0/24 over ports: 3306,3308,3312,3316,55982
10.10.10.0/24 over ports: 5800,39690,50112
ich auch eine Zählung, wie viele Ports gab es pro CIDR-Adresse hinzufügen wollte, dieses zu erhalten Ergebnis:
192.168.1.0/24 over 5 ports: 3306,3308,3312,3316,55982
10.10.10.0/24 over 3 ports: 5800,39690,50112
Ich habe versucht, Werte in Arrays setzen und den Schlüssel Druck, aber die Zählung kommt immer darauf 2.
awk '{a[$1]=a[$1] ? a[$1]","$2 : $2} {h[$1]++;} END {for (i in h) for (j in a) {print j" over "h[i]" ports: "a[j]}}' file
192.168.1.0/24 over 2 ports: 3306,3308,3312,3316,55982
10.10.10.0/24 over 2 ports: 5800,39690,50112
Ich bin bereit, andere Dinge neben awk zu tun, aber es ist vorzuziehen, aufgrund der Dateien mit den CIDR/Ports sind Millionen von Zeilen, und awk ist schnell. Irgendwelche Ideen?
Diese sehr schnell funktioniert für Dateien unter 25 MB. Wenn die Dateien größer werden, wird es langsam. Wenn ich andreatsh antworte, funktioniert es besser für größere Dateien, macht aber bei kleineren Dateien keinen großen Unterschied. – RG1