Como mostrar apenas interfaces iniciando com um certo padrão

3

O Open-Vswitch cria interfaces virtuais, todas elas têm esse padrão: s[digit]-eth[digit] Por exemplo: s1-eth1, s1-eth2, s12-eth3, s2-eth3 ...

Eu quero mostrar informações de - por exemplo - todas as interfaces começando com s1 (no nosso exemplo, deve dar s1-eth1 e s1-eth2) .

Eu tentei este comando, mas ele mostra apenas a primeira linha de informação:

EstoumaisinteressadoeminformaçõescomoRXpackets,TXpackets,erros,HWaddr..assim:

    
por Dimareal 09.02.2018 / 12:56

5 respostas

2

Para sua atual ifconfig output:

ifconfig | grep -A7 --no-group-separator '^s1-eth'
    
por 09.02.2018 / 13:03
7
A saída de

ifconfig tem uma linha em branco entre cada interface, tornando-a perfeitamente adequada para leitura e processamento no "modo de parágrafo" em uma linguagem de script como awk ou perl . Um "parágrafo" é qualquer bloco de texto separado de outros blocos por uma ou mais linhas vazias.

Por exemplo:

ifconfig | awk -v RS='' '/^s1-eth[12]:/ {print}'

O exemplo awk acima define o separador de registro de awk ( RS ) para a sequência vazia, fazendo com que processe parágrafos em vez de linhas individuais. Nesse caso, cada parágrafo é testado para uma correspondência com ^s1-eth[12]: e é impresso se corresponder a.

Exemplo de saída do meu sistema:

$ ifconfig | awk -v RS='' '/^(ppp0|lo):/ {print}'
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 64237556  bytes 36962222928 (34.4 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 64237556  bytes 36962222928 (34.4 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1412
        inet ip.ip.ip.ip  netmask 255.255.255.255  destination ip.ip.ip.ip
        ppp  txqueuelen 3  (Point-to-Point Protocol)
        RX packets 28220997  bytes 19305565357 (17.9 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 21719890  bytes 3009382446 (2.8 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Observe que isso não é mais impresso em parágrafos - não há linha vazia entre cada interface "registro". Se você quiser parágrafos em sua saída, defina o separador de registro de saída ( ORS ) como duas novas linhas ( \n\n ). por exemplo,

ifconfig | awk -v RS='' -v ORS='\n\n' '/^(ppp0|lo):/ {print}'

Fazer algo semelhante com a saída de ip em vez de ifconfig é um pouco mais complicado. ip não produz saída ordenadamente separada por parágrafo. No entanto, ele gera a saída de cada interface em um bloco com o número da interface seguido por dois-pontos e um espaço no início de uma linha, com o restante dos detalhes das interfaces a seguir.

Para fazer uso disso, configure o RS para a expressão regular ( (^|\n)[0-9]+: ). Isso corresponde a quaisquer dígitos seguidos por dois-pontos e um espaço ( [0-9]+: ) no início do arquivo ( ^ , para corresponder ao primeiro registro, que seria ignorado) ou imediatamente após uma nova linha.

Por exemplo, no meu sistema:

$ ip addr | awk -v RS='(^|\n)[0-9]+: ' '/^(lo|eth0):/ {print}'
lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether 01:33:ed:b0:13:a9 brd ff:ff:ff:ff:ff:ff

(meu eth0 não tem nenhum endereço IP porque eu o configurei como uma ponte para VMs e contêineres docker. Os endereços IP estão na interface br0 )

    
por 09.02.2018 / 15:18
4

Você pode usar grep -An para imprimir a linha correspondente e os n seguintes, mas isso é um pouco desordenado, pois o número de linhas pode variar.

Provavelmente, melhor usar awk . Isso imprimiria todas as seções que começam com enp1 ou enp3 . A primeira regra !/^ / {p=0} limpa a variável p se a linha não começar com um espaço, o segundo /^enp[13]/ {p=1} definirá se a linha começa com os nomes de interface que queremos e, em seguida, imprimiremos se p estiver definido . As linhas que começam com espaços correspondem apenas à última regra, então são impressas com base no valor anterior de p .

# /sbin/ifconfig -a  |awk '!/^ / {p=0} /^enp[13]/ {p=1}; p'
enp1s0    Link encap:Ethernet  HWaddr ... 
          inet addr:...
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:135284106 errors:0 dropped:0 overruns:0 frame:0
          TX packets:144695 errors:0 dropped:0 overruns:0 carrier:2
          collisions:0 txqueuelen:1000 
          RX bytes:8292624956 (8.2 GB)  TX bytes:16595674 (16.5 MB)
enp3s0    Link encap:Ethernet  HWaddr ...  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

No seu caso, é claro que você usaria um padrão como /^s1-eth/ .

    
por 09.02.2018 / 13:36
2

I want to show information of -for example- all interfaces starting with s1

Usando net-tools :

ifconfig | grep s1 -A9

Usando iproute2 :

ip -s link | grep s1 -A7
    
por 09.02.2018 / 13:21
-1
 ifconfig | awk '/^s[[:digit:]]+-eth[[:digit:]]+:/ {flag=1} /!^[[:digit:]]+-eth[[:digit:]]+:/ {flag=0}flag'

Usando o awk, combine o padrão como descrito, definindo um sinalizador de impressão como 1, se existir, e 0, se não. Imprimir com base na bandeira.

    
por 09.02.2018 / 13:10