
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( -E
oder egrep
) weiß nichts über \d
. Verwenden Sie es -P
wie von @Alexander vorgeschlagen oder verwenden Sie es stattdessen -E
mit [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( -P
oder 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 -E
durch -P
und 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
grep
ist für diese Aufgabe etwas übertrieben. tr
reicht aus:
$ < input.txt tr -d '[]' | tr ';' '\n' | sort -u
Das sort -u
Teil entfernt doppelte Adressen.