As principais ferramentas para esse tipo de trabalho são sed
e awk
. Eles são projetados para ler um pipe ou arquivo linha por linha e transformá-lo.
Exemplo de solução sed:
sed 's/.* time=\([0-9]*\) ms//' pingoutput.txt
A saída deve:
202
206
215
Divisão do s/.* time=\([0-9]*\) ms//
:
s
significa que você quer fazer um comando de substituição. Comandos de substituição têm o padrão s/<pattern to match>/<replacement pattern>/
.
O <pattern to match>
é .* time=\([0-9]*\) ms
O .
é qualquer caractere. O *
diz que qualquer caractere pode aparecer zero ou mais vezes. Isso é consumir todos os caracteres até a parte time=
da linha.
A parte \( \)
define o que é chamado de grupo. O que for correspondido pelo padrão entre os parênteses será classificado em um grupo chamado 1, já que há apenas um grupo em nosso padrão.
A parte dentro de \( \)
é [0-9]*
, que diz corresponder a qualquer caractere entre o caractere 0
e o caractere 9
(todos os dígitos) e novamente o *
significa que pode haver zero ou mais . Isso corresponderá ao número em que você está interessado.
Finalmente, temos ms
no final para consumi-lo da linha.
O <replacement pattern>
é apenas
; Isso significa que você deseja substituir toda a string correspondente pelo que foi capturado pelo grupo 1 no padrão de correspondência.
Você pode fazer isso com awk
também; Eu recomendo aprender a usar as duas ferramentas.
Adição:
Para ordenar o valor numericamente, você precisa transmitir os resultados usando o '|' na ferramenta de classificação. Mas, para ter certeza de que os horários estão ordenados numericamente, você deseja usar sort -n
, caso contrário, você pode obter uma ordem de classificação estranha.
sed 's/.* time=\([0-9]*\) ms//' pingoutput.txt | sort -n
Adição adicional para suportar números decimais
sed 's/.* time=\([0-9]*\(\.[0-9]*\)\{0,1\}\) ms//' pingoutput.txt | sort -n
O que eu fiz foi adicionar uma parte opcional que descreve a parte decimal do número dentro do grupo que era \ ([0-9] * \) que adicionei:
O subgrupo Anther que pode aparecer 0 ou 1 vez apenas é descrito por \ (\) \ {0,1 \} a parte em {} o primeiro número é a ocorrência mínima do segundo número máximo.
O padrão dentro desse grupo é \. [0-9] * a razão pela qual temos que fazer isso, mas a partir do '.' é de outra forma como você sabe agora '. significa qualquer caractere para que apenas permita um '.' você tem que escapar com \