Corresponde aos pares de “valor da palavra-chave” da entrada semi-estruturada

1

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
    
por roaima 15.07.2015 / 12:41

2 respostas

1

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"; }}'
    
por 15.07.2015 / 14:54
1

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}
'
    
por 16.07.2015 / 02:50