Lage:
Ich habe eine große Datei (Millionen von Zeilen) mit IP-Adressen und Ports aus einer mehrstündigen Netzwerkerfassung, eine IP / Port pro Zeile. Zeilen haben dieses Format:
ip.ad.dre.ss[:port]
Erwünschtes Ergebnis:
Für jedes Paket, das ich während der Protokollierung erhalten habe, gibt es einen Eintrag, daher gibt es viele doppelte Adressen. Ich möchte dies durch ein Shell-Skript ausführen können, das es auf Zeilen des Formats reduzieren kann
ip.ad.dre.ss[:port] count
Wo count
ist die Anzahl der Vorkommen dieser bestimmten Adresse (und Port). Es müssen keine besonderen Arbeiten durchgeführt werden. Behandeln Sie verschiedene Ports als unterschiedliche Adressen.
Bisher verwende ich diesen Befehl, um alle IP-Adressen aus der Protokolldatei zu entfernen:
grep -o -E [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+(:[0-9]+)? ip_traffic-1.log > ips.txt
Daraus kann ich einen ziemlich einfachen regulären Ausdruck verwenden, um alle IP-Adressen herauszukratzen, die von meiner Adresse gesendet wurden (was mir egal ist).
Ich kann dann Folgendes verwenden, um die eindeutigen Einträge zu extrahieren:
sort -u ips.txt > intermediate.txt
Ich weiß nicht, wie ich die Zeilenanzahl irgendwie mit sortieren aggregieren kann.
-bgr
zufällig eine Mnemonik aussiehtbigger
, was wir oben wollen..bashrc
oder.bash_aliases
Datei :function countuniquelines () { sort "$1" | uniq -c | sort -bgr; }
. Rufen Sie ancountuniquelines myfile.txt
.sort -nr
.Um zählt die Gesamtzahl der einzelnen Linien (dh ohne Berücksichtigung von doppelten Zeilen) können wir verwenden
uniq
oder Awk mitwc
:Awks Arrays sind assoziativ, sodass sie möglicherweise etwas schneller als das Sortieren ausgeführt werden.
Textdatei generieren:
quelle
Dies ist der schnellste Weg, um die Anzahl der wiederholten Zeilen zu ermitteln und sie schön drucken zu lassen, sortiert nach den am wenigsten häufigen bis den häufigsten:
Wenn Sie sich nicht für die Leistung interessieren und etwas möchten, an das Sie sich leichter erinnern können, führen Sie einfach Folgendes aus:
PS:
sort -n parse das Feld als Zahl, das ist richtig, da wir nach den Zählwerten sortieren.
quelle
!
In{!seen[$0]++}
ist hier überflüssig, da wir nur das Drucken amEND
.