Extrahieren Sie durch Semikolon getrennte Adressen und drucken Sie jede Adresse in einer Zeile

Extrahieren Sie durch Semikolon getrennte Adressen und drucken Sie jede Adresse in einer Zeile

Ich habe eine Datei mit der folgenden Eingabe. Die durch Punkte getrennten Zahlen stellen Adressen dar. Jede Zahl in der Adresse kann wie folgt eine oder mehrere Ziffern haben:

[112.112.112.112;3.3.3.3;44.44.44.44]
[6.6.6.6;17.17.17.17;88.88.88.88]

Ich möchte jede Adresse ohne Semikolon und Klammern extrahieren (Adressen sind durch Semikolon getrennt ;) und jede Adresse in eine Zeile einer neuen Datei einfügen, um diese Ausgabe zu erzeugen:

112.112.112.112
3.3.3.3
44.44.44.44
6.6.6.6
17.17.17.17
88.88.88.88

Als ersten Schritt habe ich versucht, die Adressen mit grep wie folgt zu extrahieren:

grep -E '\d+\.\d+\.\d+\.\d+' myfile.txt > newfile.txt

Es wird aber nichts gedruckt.

Antwort1

Erweiterter regulärer Ausdruck( -Eoder egrep) weiß nichts über \d. Verwenden Sie es -Pwie von @Alexander vorgeschlagen oder verwenden Sie es stattdessen -Emit [0-9]oder [[:digit:]].

Fügen Sie hinzu -o, um nur die Übereinstimmungen auszuwählen, anstatt ganze übereinstimmende Zeilen. Dadurch werden auch die einzelnen Übereinstimmungen in neue Zeilen aufgeteilt.

grep -Eo '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' myfile.txt

oder

grep -Eo '[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+' myfile.txt

mitPerl Regex( -Poder pgrep):

grep -Po '\d+\.\d+\.\d+\.\d+' myfile.txt

Wenn Sie +zu wechseln, *können Sie auchGrundlegende reguläre Ausdrücke:

grep -o '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' myfile.txt

Antwort2

Ersetzen -Edurch -Pund hinzufügen -o:

 grep -P -o '\d+\.\d+\.\d+\.\d+' myfile.txt

Antwort3

Verwendung von awk:

awk 'NF' RS='[][;]' infile

Oder tr, wenn Ihnen die erste Leerzeile nichts ausmacht:

tr -s '];[' '\n' <infile

Antwort4

grepist für diese Aufgabe etwas übertrieben. trreicht aus:

$ < input.txt tr -d '[]' | tr ';' '\n' | sort -u

Das sort -uTeil entfernt doppelte Adressen.

verwandte Informationen