Eingang 1
eno16780032: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.1 netmask 255.255.255.255 broadcast 192.168.0.254
ether 00:50:56:00:00:00 txqueuelen 1000 (Ethernet)
eno33559296: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.2 netmask 255.255.255.255 broadcast 192.168.0.254
ether 00:50:56:00:00:01 txqueuelen 1000 (Ethernet)
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 0 (Local Loopback)
Eingang 2
bond0 Link encap:Ethernet HWaddr 00:50:56:00:00:00
inet addr:192.168.0.1 Bcast:192.168.0.254 Mask:255.255.254.255
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
bond0:0 Link encap:Ethernet HWaddr 00:50:56:00:00:00
inet addr:192.168.0.1 Bcast:192.168.0.254 Mask:255.255.254.255
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
eth0 Link encap:Ethernet HWaddr 00:50:56:00:00:00
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
eth1 Link encap:Ethernet HWaddr 00:50:56:00:00:00
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
Ich möchte eine Ausgabe wie folgt (im Wesentlichen extrahierenSchnittstelle, IP- und Hardwareadresse)
Ausgabe1
eno16780032 192.168.0.1 00:50:56:00:00:00
eno33559296 192.168.0.2 00:50:56:00:00:01
lo 127.0.0.1
Ausgabe2
bond0 192.168.0.1 00:50:56:00:00:00
bond0:0 192.168.0.2 00:50:56:00:00:00
eth0 00:50:56:00:00:00 ===> No IP since its under bonding
eth1 00:50:56:00:00:00 ===> No IP since its under bonding
lo 127.0.0.1
Ich habe es mit awk versucht (awk '/flags|Link/{a=$1;hw=$NF;next;} /inet /{ip=$2;print a,ip,hw}'),
, aber da nicht alle Übereinstimmungsmuster in jeder Zeile verfügbar sind, konnte ich nicht die gewünschte Ausgabe erhalten.
Ich denke also daran, der Eingabedatei 2 ein leeres passendes Muster für „inet addr:“ hinzuzufügen, da die Schnittstellen Teil der Bindung sind, und dann wäre alles in Ordnung.
Können Sie mir bitte helfen, entweder ein leeres „inet addr:“ nach der Schnittstellenzeile hinzuzufügen?
eth0 Link encap:Ethernet HWaddr 00:50:56:00:00:00 UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1 inet addr: <==== Insert empty line
oder
- Um die gewünschte Ausgabe wie oben beschrieben zu erhalten.
Antwort1
awk 'BEGIN { OFS="\t" }; # use tab for output separator
! /^ / { # line doesnt begin with a space, must be an interface line, extract it
i=gensub(/:$/,"",1,$1)
mac[i]=$5; # this will either be a HWAddr or empty
ifaces[i]=1
};
/^ +inet/ { ip[i] = ip[i] " " gensub(/addr:/,"",1,$2) };
/^ +ether/ { mac[i]=$2}; # this will only match if there WASNT a HWAddr on the iface line
END {
for (i in ifaces) {
sub(/^ +/,"",ip[i]); # remove unwanted space from beginning of ip addresses
#if (ip[i] == "") ip[i] = "--"; #optional
#if (mac[i] == "") mac[i] = "--"; #optional
print i, ip[i], mac[i]
}
}' filename | sort
(oder leiten Sie ifconfig
es einfach weiter, anstatt ihm einen Eingabedateinamen zu geben)
Dieses awk-Skript kann beide Ausgabevarianten verarbeiten ifconfig
und gibt drei durch Tabulatoren getrennte Felder aus: Schnittstellennamen, IP-Adressen und MAC-Adressen.
Wenn im zweiten Feld mehrere IP-Adressen vorhanden sind, werden diese durch ein Leerzeichen getrennt.
Ausgabe, wenn sie mit input1 ausgeführt und weitergeleitet wird an sort
:
eno16780032 192.168.0.1 00:50:56:00:00:00
eno33559296 192.168.0.2 00:50:56:00:00:01
lo 127.0.0.1
Ausgabe, wenn sie mit input2 ausgeführt und in Folgendes weitergeleitet wird sort
:
bond0:0 192.168.0.1 00:50:56:00:00:00
bond0 192.168.0.1 00:50:56:00:00:00
eth0 00:50:56:00:00:00
eth1 00:50:56:00:00:00
lo 127.0.0.1
HINWEIS: Ihre angeforderte Ausgabe hatte 192.168.0.2 als IP-Adresse für bond0:0, aber Ihre Beispieldaten hatten 192.168.0.1, dasselbe wie für die bond0
Schnittstelle.
Wenn Sie die „optionalen“ Zeilen im Skript auskommentieren, wird sichergestellt, dass immer drei durch Tabulatoren getrennte Ausgabefelder vorhanden sind, auch wenn das Feld für die IP-Adresse oder MAC-Adresse leer ist.
Die Ausgabe würde wie folgt aussehen:
eno16780032 192.168.0.1 00:50:56:00:00:00
eno33559296 192.168.0.2 00:50:56:00:00:01
lo 127.0.0.1 --
Und
bond0:0 192.168.0.1 00:50:56:00:00:00
bond0 192.168.0.1 00:50:56:00:00:00
eth0 -- 00:50:56:00:00:00
eth1 -- 00:50:56:00:00:00
lo 127.0.0.1 --
Zusätzliche Kommentare:
es ist einFehlerum den ip
Befehl zu ignorieren. Er ist seit Jahren Standard unter Linux und wird von vielen Programmen verwendet, die einer Schnittstelle sekundäre/alternative/"Alias"-IP-Adressen hinzufügen. Sekundäre IP-Adressen, die auf diese Weise einer Schnittstelle hinzugefügt werden, werdenNURmit angezeigt werden ip addr show
, sie werden NICHT angezeigt, wenn ifconfig
ausgeführt wird.
ifconfig
sollte zumindest unter Linux nur als Legacy betrachtet werden.
Antwort2
Eine naive, aber effektive Lösung besteht darin, die Ausgabe von in umgekehrter Reihenfolge zu lesen ifconfig
. Auf diese Weise haben wir jedes Mal, wenn wir auf die erste Zeile eines Blocks stoßen, entweder die Felder gefunden, an denen wir interessiert sind, oder wir können davon ausgehen, dass sie fehlen. Angesichts des AWK-Skripts:
{
for (i = 1; i <= NF; i++) {
if ($i == "inet") {
ip = $(i+1)
sub(/.*:/, "", ip)
}
if ($i == "HWaddr" || $i == "ether")
hw = $(i+1)
}
}
/^[^[:blank:]]/ {
nm = $1
sub(/:$/, "", nm)
print nm,ip,hw
nm = ""
ip = ""
hw = ""
}
und vorausgesetzt, Sie haben es als gespeichert awkscript
, können Sie dann Folgendes tun:
ifconfig | tac | awk -f awkscript | tac | column -s ' ' -t
Falls tac
Ihnen der nicht standardmäßige Befehl nicht zur Verfügung steht, kann dieses AWK-Skript leicht geändert werden, um den gesamten Eingabestrom in einem Array zu speichern und ihn in einem END
Block rückwärts zu verarbeiten.
Antwort3
$ cat tst.awk
!/^[[:space:]]/ { if (NR>1) prt() }
{ rec = rec FS $0 }
END { prt() }
function prt( flds,i,nf,map) {
sub(/: /," ",rec)
sub(/ ether /," HWaddr ",rec)
sub(/ inet addr:/," inet ",rec)
nf = split(rec,flds)
map["iface"] = flds[1]
for (i=2; i<nf; i++) {
map[flds[i]] = flds[i+1]
}
print map["iface"], map["inet"], map["HWaddr"]
rec = ""
}
$ awk -f tst.awk file1 | column -s' ' -t
eno16780032 192.168.0.1 00:50:56:00:00:00
eno33559296 192.168.0.2 00:50:56:00:00:01
lo 127.0.0.1
$ awk -f tst.awk file2 | column -s' ' -t
bond0 192.168.0.1 00:50:56:00:00:00
bond0:0 192.168.0.1 00:50:56:00:00:00
eth0 00:50:56:00:00:00
eth1 00:50:56:00:00:00
lo 127.0.0.1