Para sua atual ifconfig
output:
ifconfig | grep -A7 --no-group-separator '^s1-eth'
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:
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
)
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/
.
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
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.