Ich habe 90 Gigabyte Daten aus 13,5 Terabyte ausgewählt.
Ich habe es sort -u | uniq
mit Daten versucht, die aus den 13,5 T Syslog-Daten extrahiert wurden.
Es waren offensichtlich einige fehlerhafte Daten vorhanden, also habe ich die Analyse mit awk erneut ausgeführt und Folgendes „gesehen“:
awk -F, '!seen[$1]++' inputfile > outputfile
Dies erwies sich als die zeiteffizienteste Methode, enthielt aber auch einige fehlerhafte Daten ... möglicherweise gibt es fehlerhafte Protokolleinträge oder beim Sortieren von Uniq und Awk wurden einige Zeilen verfälscht. Es ist mir egal, ob es eine bessere Möglichkeit gibt, die Originaldaten zu analysieren, da ich eine ausreichend große Stichprobe habe - was bedeutet, dass es in Ordnung ist, ein paar Daten von 13,5 T zu verlieren.
Es gibt 3 IP-Adressen pro gültiger Zeile.
Da eine IP-Adresse drei Punkte enthält, brauche ich etwas, das nur Zeilen mit neun „.“ analysiert.
Antwort1
Betrachten wir dies als Testdatei:
$ cat testfile
1.2.3.4 5.6.7.8 9.10.11.12 Keep
1.2.3.4 5.6.7.8 9.10.11 Bad: Missing 1
1.2.3.4 5.6.7.8 9.10.11.12. Bad: Extra period
Verwenden von grep
So wählen Sie Zeilen mit genau neun Punkten aus:
$ grep -E '^([^.]*\.){9}[^.]*$' testfile
1.2.3.4 5.6.7.8 9.10.11.12 Keep
[^.]*\.
stimmt mit einer beliebigen Anzahl von Zeichen überein, die kein Punkt sind, gefolgt von einem ([^.]*\.){9}
stimmt mit genau neun Sequenzen von null oder mehr Zeichen überein, die kein Punkt sind, gefolgt von einem Punkt. Das ^
am Anfang erfordert, dass die reguläre Ausdrucksübereinstimmung am Anfang der Zeile beginnt. Das [^.]*$
bedeutet, dass zwischen dem Ende der neun Sequenzen und dem Ende der Zeile nur Zeichen zulässig sind, die kein Punkt sind.
Verwenden von sed
$ sed -En '/^([^.]*\.){9}[^.]*$/p' testfile
1.2.3.4 5.6.7.8 9.10.11.12 Keep
Die -n
Option weist sed an, nicht zu drucken, es sei denn, wir fordern es ausdrücklich dazu auf. Der p
folgende reguläre Ausdruck fordert sed ausdrücklich auf, die Zeilen zu drucken, die dem regulären Ausdruck entsprechen.
Verwenden von awk
$ awk '/^([^.]*\.){9}[^.]*$/' testfile
1.2.3.4 5.6.7.8 9.10.11.12 Keep
Oder verwenden Sie die Möglichkeit von awk, ein Zeichen zur Trennung von Feldern zu definieren (Hut ab:Jeff Schaller):
$ awk -F. 'NF==10' testfile
1.2.3.4 5.6.7.8 9.10.11.12 Keep