
Dies wird in einem Perl-Skript sein. Ich muss diese Nummer erfassen und sie für die neuen IPs um eins erhöhen. Hat jemand einen Einzeiler für mich? Kann Bash/Perl sein.
bearbeiten
Gegeben: die folgende Eingabe.
inet xx.182.137.90/29 brd xxx.182.137.95 scope global eth0
inet xxx.182.137.91/24 brd xxx.182.137.255 scope global eth0:1
inet xxx.182.137.92/24 brd xxx.182.137.255 scope global secondary eth0:2
inet xxx.182.137.93/24 brd xxx.182.137.255 scope global secondary eth0:3
inet xxx.182.137.94/24 brd xxx.182.137.255 scope global secondary eth0:4
Es sollte 4 ausspucken. Angesichts dessen, was Sie mir unten gegeben haben
$ ip addr | grep -e 'eth[0-9]:[0-9]' | cut -d: -f2
Wenn Sie Ihre Antwort darauf ändern, werde ich sie akzeptieren, da sie mir dabei geholfen hat, dies zu verstehen.
Antwort1
ifconfig
Wenn ich Ihre Frage richtig verstehe, möchten Sie einen einzeiligen Befehl, der die Ausgabe übernimmt ifconfig
und das nächste zu verwendende eth:xx-Gerät zurückgibt.
Wenn wir also eth0:0, eth0:1 und eth0:2 verwenden, sollte der Befehl 3 zurückgeben?
Beispiel
Ein Befehl wie dieser sollte tun, was Sie wollen.
$ if (ifconfig | grep -q "^eth"); then \
echo $(($(ifconfig | grep -Po "(?<=^eth[0-9]:)\d+" | sort -n | tail -1) + 1)); \
else echo 0;fi
Wenn wir also ein Ethernet-Gerät haben:
$ ifconfig | grep eth
eth0:0 Link encap:Ethernet HWaddr F0:DE:F1:2F:7D:4E
Unser Befehl würde eine 1 zurückgeben:
$ if (ifconfig | grep -q "^eth"); then echo $(($(ifconfig | grep -Po "(?<=^eth[0-9]:)\d+" | sort -n | tail -1) + 1)); else echo 0;fi
1
Wenn wir keine Ethernet-Geräte haben, geben wir eine 0 zurück:
$ if (ifconfig | grep -q "^eth"); then echo $(($(ifconfig | grep -Po "(?<=^eth[0-9]:)\d+" | sort -n | tail -1) + 1)); else echo 0;fi
0
Einzelheiten
OK, es scheint, als ob hier eine Menge los ist, aber es ist ziemlich unkompliziert.
- if-Anweisung - zunächst müssen wir wissen, ob esbeliebigEthernet-Geräte, also führen wir es aus
ifconfig
und durchsuchen die Ausgabe nach einem. Wenn wir eines finden, führen wir esifconfig
erneut aus und analysieren es. - 2. ifconfig - Hier analysieren wir jetzt tatsächlich die Ausgabe. Wir verwenden
grep
die PCRE-Funktion (-P
), um nach den Zeichenfolgen zu suchen, die mit ethXX: beginnen. Der-o
Schalter gibt die Ziffer zurück, die nach ethXX: auftritt. - Sortieren – Wir sortieren
sort
die Ergebnisse dann numerisch, falls wir mehrere ethXX:YY-Geräte haben. - tail – gibt das letzte zurück, dies ist das ethXX:YY-Gerät mit dem höchsten Wert.
- Wir erhöhen diese Zahl dann über
$(( $(ifconfig ...) + 1 ))
. Wenn also ethXX:YY 0 ist, erhalten wir0 + 1
als Ergebnis ein1
. - echo - wir geben dann
echo
die Ergebnisse aus Schritt 5 aus. - Wenn in der Ausgabe kein eth-Gerät vorhanden ist
ifconfig
, geben Sie 0 zurück, da dies das erste ist.
IP-Adresse
Wenn Sie stattdessen Folgendes verwenden möchten, ip addr
können Sie hierzu diese Form der oben bereitgestellten Lösung nutzen.
$ if (ip addr | grep -q "eth"); then \
echo $(($(ip addr | grep -Po "(?<=eth[0-9]:)\d+" | sort -n | tail -1) + 1)); \
else echo 0;fi
Beispiel
Verwenden Sie Ihre Beispieldaten:
inet xx.182.137.90/29 brd xxx.182.137.95 scope global eth0
inet xxx.182.137.91/24 brd xxx.182.137.255 scope global eth0:1
inet xxx.182.137.92/24 brd xxx.182.137.255 scope global secondary eth0:2
inet xxx.182.137.93/24 brd xxx.182.137.255 scope global secondary eth0:3
inet xxx.182.137.94/24 brd xxx.182.137.255 scope global secondary eth0:4
Dieser Befehl würde eine 5 zurückgeben:
$ if (ip addr | grep -q "eth"); then echo $(($(ip addr | grep -Po "(?<=eth[0-9]:)\d+" | sort -n | tail -1) + 1)); else echo 0;fi
5
Antwort2
Dies ist keine direkte Antwort auf Ihre Frage, sondern eher eine alternative Lösung.
Die alternative Lösung besteht in der Verwendung voniproute2utilities. ifconfig
ist veraltet und wird langsam veraltet. Es ist unzureichend und kann den Linux-Netzwerk-Stack nicht vollständig manipulieren.
Wie Sie beispielsweise von wissen , müssen Sie für jede IP, die Sie dieser Maschine zuweisen möchten, ifconfig
eine Aliasschnittstelle (, usw.) erstellen eth0:0
. Dies ist ein Problem, da Sie nur 255 Schnittstellenaliase haben können. Mit dem Befehl von iproute2 können Sie einer einzelnen Schnittstelle beliebig viele IPs zuweisen.eth0:1
ip
Anwendungsbeispiel:
# ip addr show dev enp5s0
2: enp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether b8:97:5a:4e:d5:4e brd ff:ff:ff:ff:ff:ff
inet 192.168.0.20/24 brd 192.168.0.255 scope global enp5s0
valid_lft forever preferred_lft forever
inet6 fe80::ba97:5aff:fe4e:d54e/64 scope link
valid_lft forever preferred_lft forever
# ip addr add 10.0.0.1/24 dev enp5s0
# ip addr show dev enp5s0
2: enp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether b8:97:5a:4e:d5:4e brd ff:ff:ff:ff:ff:ff
inet 192.168.0.20/24 brd 192.168.0.255 scope global enp5s0
valid_lft forever preferred_lft forever
inet 10.0.0.1/24 scope global enp5s0
valid_lft forever preferred_lft forever
inet6 fe80::ba97:5aff:fe4e:d54e/64 scope link
valid_lft forever preferred_lft forever
Sie müssen nichts über die aktuelle Konfiguration der Schnittstelle wissen, außer ihrem Namen. Sie müssen nicht die nächste unbenutzte Schnittstellenaliasnummer berechnen.