Extraiga el nombre de la interfaz, la dirección IP y la dirección IP de ifconfig (debe usar comandos ifconfig, no ip)

Extraiga el nombre de la interfaz, la dirección IP y la dirección IP de ifconfig (debe usar comandos ifconfig, no ip)

Entrada 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)

Entrada 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

Quiero una salida como (Básicamente para extraerInterfaz, IP y dirección de hardware)

Salida1

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

Salida2

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

Lo intenté con awk (awk '/flags|Link/{a=$1;hw=$NF;next;} /inet /{ip=$2;print a,ip,hw}'), pero no todos los patrones coincidentes están disponibles en cada línea. No se puede obtener la salida deseada.

Entonces, pensar en agregar un patrón coincidente vacío "inet addr:" en el archivo de entrada 2 para las interfaces es parte de la vinculación y todo estaría bien.

  1. ¿Puede ayudarnos a agregar "inet addr:" vacío después de la línea de interfaz?

     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
    

o

  1. Para obtener el resultado deseado como se mencionó anteriormente.

Respuesta1

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

(o simplemente acceda ifconfiga él en lugar de darle un nombre de archivo de entrada)

Este script awk puede manejar cualquier variante de ifconfigsalida y genera tres campos separados por tabulaciones: nombres de interfaz, direcciones IP y direcciones MAC.

Si hay más de una dirección IP en el segundo campo, están separadas por un espacio.

Salida cuando se ejecuta contra input1 y se canaliza a 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

Salida cuando se ejecuta contra input2 y se canaliza a 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

NOTA: la salida solicitada tenía 192.168.0.2 como dirección IP para bond0:0, pero los datos de muestra tenían 192.168.0.1, igual que para la bond0interfaz.

Si descomenta las líneas "opcionales" en el script, se asegurará de que siempre haya 3 campos de salida separados por tabulaciones, incluso si el campo de dirección IP o dirección MAC está vacío.

La salida se vería así:

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

y

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

Comentarios adicionales:

Es unerrorpara ignorar el ipcomando. Ha sido estándar en Linux desde hace años, y muchos programas que agregan direcciones IP secundarias/alternativas/"alias" a una interfaz lo utilizarán. Las direcciones IP secundarias agregadas a una interfaz de esta maneraSOLOse mostrarán con ip addr show, NO aparecerán cuando ifconfigse ejecute.

ifconfigdebe considerarse solo heredado, al menos en Linux.

Respuesta2

Una solución ingenua pero efectiva es leer la salida de ifconfigal revés; De esta manera, cada vez que nos encontramos con la primera línea de un bloque, o hemos encontrado los campos que nos interesan o podemos asumir con seguridad que faltan. Dado el guión AWK:

{
  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 = ""
}

y suponiendo que lo hayas guardado como awkscript, puedes hacer:

ifconfig | tac | awk -f awkscript | tac | column -s ' ' -t

En caso de que el comando no estándar tacno estuviera disponible para usted, este script AWK podría modificarse fácilmente para guardar todo el flujo de entrada en una matriz y procesarlo a la inversa en un ENDbloque.

Respuesta3

$ 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

información relacionada