Wie kann ich mithilfe von Shell-Skripten überprüfen, ob eine IP-Adresse in einer Datei vorhanden ist?


13

Ich habe ein Skript, das einige Ausgaben generiert. Ich möchte diese Ausgabe auf eine IP-Adresse wie überprüfen

159.143.23.12
134.12.178.131
124.143.12.132

if (IPs are found in <file>)
then // bunch of actions //
else // bunch of actions //

Ist fgrepeine gute idee

Ich habe Bash zur Verfügung.


Verwenden Sie grep, egrep, awk oder sed, was auch immer Sie möchten
Ijaz Ahmad Khan

Könnten Sie bitte bei der Syntax helfen? Ich meine, wie sucht es nach einer zufälligen IP. Wie beschreibt man das Muster? Ich würde nach einer IP-Adresse suchen, nicht nach einer bestimmten Adresse.
Koshur

5
Sind das nur IPv4-Adressen in Quad-Dezimal-Notation? Könnten sie so geschrieben sein 0010.0000.0000.0001? Darf die Datei ansonsten Dinge enthalten, die wie IP-Adressen aussehen, wie Versionsnummern ( soft-1.2.1100.1.tar.gz, Netzwerkspezifikationen (10.0.0.0/24), 1.2.3.4.5)? Würden Sie eine Lösung akzeptieren, die positiv auf 333.444.555.666 ist? Oder 0377.0377.0377.0377(eine gültige vieroktale IP-Adresse)?
Stéphane Chazelas

Wenn bashverfügbar, ist dies awknormalerweise auch awk '/([0-9]{2,3}\.){3}/ {print $5 "\t" $1}'der Fall , sodass dies für Sie möglicherweise funktioniert: (Dieser Einzeiler übersetzt die Ausgabe der Host-XFR-Liste in das /etc/hostsFormat.)
Mark Hudson,

Antworten:


25

Ja, Sie haben viele Optionen / Tools zur Verfügung. Ich habe es gerade versucht, es funktioniert:

ifconfig | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"

So können Sie grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"die IP-Adressen aus Ihrer Ausgabe abrufen.


Vielen Dank. Das funktioniert. Kannst du ein bisschen erklären? Ist das ein regulärer Ausdruck?
Koshur

Ja, dies ist ein regulärer Ausdruck, der in bash mit grep verwendet wird. Sie suchen nur nach einem dreistelligen Muster, das durch Punkte getrennt ist. Sie können damit spielen, indem Sie die Zahlen in {1,2} für 2 aufeinanderfolgende Ziffern usw. ändern
Ijaz Ahmad Khan

Man kann auch verwenden "\b([0-9]{1,3}\.){3}[0-9]{1,3}\/[0-9][0-9]?", um CIDRs zu finden (vorausgesetzt, sie sind gültig)
vikas027

2

Meine Antwort basierend auf dieser Antwort starten:

Ja, Sie haben viele Optionen / Tools zur Verfügung. Ich habe es gerade versucht, es funktioniert:

ifconfig | grep -oE "\ b ([0-9] {1,3}.) {3} [0-9] {1,3} \ b" a, damit Sie grep -oE "\ b ([0- 9] {1,3}.) {3} [0-9] {1,3} \ b ", um die IP-Adressen aus Ihrer Ausgabe abzufragen.

und die Antwort in IPv6 in voller Länge konvertieren, etc ...:

fgrep -oE "\b([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4}\b" -- file

Wenn Sie das / nnn behalten möchten, wenn es dort ist:

fgrep -oE "\b([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4}(/[0-9]{1,3}){0,1}\b" -- file

und es gibt auch die verkürzte Version von IPv6, die '::' enthält.

Weitere IPv6-Antworten finden Sie hier: /programming/53497/regular-expression-that-matches-valid-ipv6-addresses


fgrepist der alte Name für eine Variante grep, die den Mustervergleich ignoriert. Ich würde empfehlen, stattdessen grep(oder sogar egrep) zu verwenden, zumal Sie eindeutig eine Mustererkennung wünschen.
Roaima

2

Wenn Ihre Datei zB aufgerufen wird ips, können Sie etwas schreiben wie:

while read -r ip
    do
        if [[ $ip == "$1" ]]; then
            shift
            printf '%s\n' 'action to take if match found'
        else
            printf '%s\n' 'action to take if match not found'
        fi
    done < ips

Dann können Sie die Parameter wie folgt dem Skript übergeben

./myscript 159.143.23.12 134.12.178.131 124.143.12.132 124.143.12.132

0

Wenn Sie die Liste der IP-Adressen in einer Datei haben, hat eine pro Zeile grepbereits die bequeme -fOption:

$ man fgrep | grep file= -A1
       -f FILE, --file=FILE
              Obtain patterns from FILE, one per line.  The empty file contains zero patterns, and therefore matches nothing.  (-f is specified by POSIX.)

Dies kann aufgrund von Zeichenfolgen, denen optional eine andere Nummer folgt, zu einigen Fehlalarmen führen, um eine andere IP-Adresse festzulegen. Viele Dinge, die Sie tun können, abhängig von Ihrem Fall, können Sie sich entscheiden, sich Sorgen zu machen oder nicht.


0

Getestet in SmartOS (eine Variante von Solaris), sollte hoffentlich in anderen * nix-Umgebungen funktionieren:

egrep '(([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])'

Beispiel:

$ cat >file.txt
IP1: 192.168.1.1
IP2: 261.480.201.311
IP3: 1012.680.921.3411

$ egrep '(([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])' file.txt
IP1: 192.168.1.1

Dieses Muster passt nur gültig IPv4, das heißt, x.x.x.xwo x0-255 liegen. Wenn Sie nur die übereinstimmende IP extrahieren müssen, fügen Sie -odem obigen Befehl eine Option hinzu. Sie können diesen Befehl in ein Bash-Skript und vermutlich auch in andere Shell-Skripte einbetten. Und wenn es egrepfehlschlägt,try grep -E ...

Verwendung in einem (Bash-) Shell-Skript:

ip=$(egrep -o '(([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])' file.txt) echo $ip


0

Ich denke, meine Antwort auf einen anderen Beitrag ist hier besser geeignet. Dank dieses Beitrags und anderer, die es mögen, habe ich mir das ausgedacht, das nach dem richtigen IP-Format sucht und dann alle Zeilen beseitigt, die 256 oder mehr enthalten. Ersetzen Sie die IP durch eine ungültige, um stattdessen keine Ausgabe zu erhalten:

echo '255.154.12.231' | grep -E '(([0-9]{1,3})\.){3}([0-9]{1,3}){1}' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]'

Das erste grep wurde wahrscheinlich in diesem Beitrag gefunden und überprüft, ob Zahlen von 0-999 im Format XXXX vorliegen

Das zweite grep entfernt Zeilen mit den Nummern 256-999, so dass nur gültige Format-IPs übrig bleiben, dachte ich

ABER ... Wie von G-Man ausgeführt, habe ich zu Unrecht angenommen, dass die IP in einer eigenen Leitung ist. Meistens muss jedoch auf beiden Seiten der IP nach einem Leerzeichen oder einem anderen Teiler gesucht werden. Die Leerzeichen / Teiler können mit sed oder anderen Mitteln entfernt werden, nachdem die IP gefunden wurde. Ich habe auch -o zum ersten grep hinzugefügt:

echo ' 1234.5.5.4321 ' | grep -Eo ' (([0-9]{1,3})\.){3}([0-9]{1,3}){1} ' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]' | sed 's/ //'

echo ' 234.5.5.432 ' | grep -Eo ' (([0-9]{1,3})\.){3}([0-9]{1,3}){1} ' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]' | sed 's/ //'

Der erste gibt keine Ausgabe aus, während der zweite dies tut und die Leerzeichen entfernt werden.


Angenommen, ich habe 500 Adressen im Bereich von 10.0.0.1 bis 10.0.1.244. Ihre zweite grepwürde diese Zeile wegen der "500" werfen. (In der Frage wurde nie angegeben, dass die IP-Adresse (n) in der Datei, falls vorhanden, in einer eigenen Zeile stehen.) Auf der anderen Seite werden 1234.1.1.1 und 1.1.1.1234 akzeptiert. Aber davon abgesehen nicht schlecht.
G-Man sagt, dass Monica am

-1

Leiten Sie diese Ausgabe auf einige um outputFile

Einfach grepmit Muster wie,

grep -sE "159.143.23.12|134.12.178.131|124.143.12.132" <outputFile>

4
Beachten Sie, dass .es sich um einen Operator für reguläre Ausdrücke handelt und ein Escapezeichen erforderlich ist, damit er buchstäblich behandelt wird
Stéphane Chazelas,

1
Das sind keine Muster, das sind Literale. Keine sinnvolle Antwort, da das OP "any IP" spezifiziert hat.
Mark Hudson

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.