Nur Zeilen mit 9 Punkten analysieren

Nur Zeilen mit 9 Punkten analysieren

Ich habe 90 Gigabyte Daten aus 13,5 Terabyte ausgewählt.

Ich habe es sort -u | uniqmit 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 -nOption weist sed an, nicht zu drucken, es sei denn, wir fordern es ausdrücklich dazu auf. Der pfolgende 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

verwandte Informationen