Extrahieren Sie Schnittstellennamen, Hardwareadresse und IP-Adresse aus ifconfig (es müssen ifconfig- und keine IP-Befehle verwendet werden)

Extrahieren Sie Schnittstellennamen, Hardwareadresse und IP-Adresse aus ifconfig (es müssen ifconfig- und keine IP-Befehle verwendet werden)

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.

  1. 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

  1. 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 ifconfiges einfach weiter, anstatt ihm einen Eingabedateinamen zu geben)

Dieses awk-Skript kann beide Ausgabevarianten verarbeiten ifconfigund 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 bond0Schnittstelle.

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 ipBefehl 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 ifconfigausgeführt wird.

ifconfigsollte 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 tacIhnen 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 ENDBlock 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

verwandte Informationen