Retorna o valor (sub) correspondente específico com grep no linux

0

Estou executando um agente Zabbix (software de logging) no Ubuntu e desejo fazer ping em um IPIP / GRE Tunnel interno para medir constantemente a qualidade da conexão.

Agora, um agente do Zabbix não permite, por padrão, que um comando ping seja feito em um túnel interno, mas, felizmente, eles permitem criar "userparameters", basicamente permite executar um único comando shell unix e alimentar os dados ao seu software.

Para isso, preciso executar um comando fping / ping que recupere um único valor para o zabbix. Eu quero esse valor para ser o número de segundos decimais ou milissegundos de latência ou 0 em nenhuma conexão para nada mais de 1 segundo. Abaixo eu já trabalhei um comando que faz 5 pings para o IP do túnel, em seguida, retorna as médias.

(o endereço IP abaixo é um exemplo de dados) isso é o que eu tenho até agora:

fping -e -q -p 1000 -c 5 8.8.4.4 2> /dev/null | grep -oP '[0-9\.]+/([0-9\.]+)/[0-9\.]+$'

A string de retorno completa é assim:

8.8.4.4 : xmt/rcv/%loss = 5/5/0%, min/avg/max = 2.78/2.94/3.19"

Agora o resultado do grep é este:

2.78/2.94/3.19

Eu quero consistentemente obter o segundo valor (2,94 acima), minha pergunta então é, qual é a maneira mais eficaz de fazer isso em um único comando?

    
por Robin Gould 30.09.2016 / 17:17

2 respostas

1

Eu usaria sed em vez de grep , então seu filtro se tornará:

... | sed -n 's%^.* = .* = .*/\(.*\)/.*%%pg'

Notas: -

  • Como estamos combinando o caractere / , eu substituí o delimitador de string normal por % para simplificar a expressão, evitando a necessidade de escapar de / .
  • Estamos igualando a linha inteira e substituindo-a pelo que vem entre duas barras após dois sinais de igual, delimitadas por \( e \) na sequência de correspondência e na substituição.
  • Não emitimos nada ( -n ), exceto nas linhas em que há correspondências ( %pg ).

Para simplificar minha ilustração, usei .* para os números. Você pode usar [0-9\.]+ , mas precisará usar o RE estendido com grep -rn ...

Se você nunca usou sed , recomendo este tutorial .

    
por 30.09.2016 / 18:25
0

Por que não cut -d/ -f8 ? Como em:

echo '8.8.4.4 : xmt/rcv/%loss = 5/5/0%, min/avg/max = 2.78/2.94/3.19"' | cut -d/ -f8
    
por 30.09.2016 / 18:20