Supondo que o nome da chave apareça no máximo uma vez, veja como você pode tentar.
ip addr show dev eth0 | perl -ne 'chomp; foreach $param (qw(mtu inet brd)) { /($param)\s+(\S+)/ && do { print "$1 $2\n"; }}'
Ocasionalmente recebo saída de um comando que inclui pares de "valor-chave", possivelmente com mais de um par por linha. Como um exemplo repetitivo, considere o comando ip addr show dev eth0
:
ip addr show dev eth0 | grep -v link/ether
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe0f:dbb3/64 scope link
valid_lft forever preferred_lft forever
Para os propósitos deste exemplo, talvez queira capturar os valores a seguir mtu
, inet
e brd
(ou seja, 1500
, 10.0.2.15/24
e 10.0.2.255
, respectivamente, aqui). Pode-se supor que cada palavra-chave não ocorrerá mais de uma vez na entrada.
A única maneira de lidar com isso seria capturar a saída do comando source para uma variável temporária e repetidamente analisar até que todas as palavras-chave tenham sido processadas.
Existe uma maneira mais fácil ou melhor de escolher esses pares de "valor-chave", descartando o restante do texto?
Exemplo de fornecimento sugerido e saída não ordenada:
ip addr show dev eth0 | someCommand brd inet mtu
mtu 1500
inet 10.0.2.15/24
brd 10.0.2.255
Aqui está uma solução awk que coloca cada palavra em sua própria linha, e sempre que encontrar uma das chaves especificadas, imprime a palavra e a seguinte. As chaves são, na verdade, uma expressão regular que precisa corresponder à palavra inteira.
ip addr show dev eth1 |
tr -s ' ' '\n' |
awk -v keys='mtu|inet|brd' '
match($0, "^(" keys ")$") {printf "%s ", $0; getline; print}
'