Isto, assim como a resposta de Sergiy , veio de Faça um loop sobre o arquivo de texto com URLs e execute ping em cada .
Supondo que o arquivo urls
resida no diretório atual e contenha seus URLs somente , um por linha:
#!/bin/bash
while IFS='' read -r l || [ -n "$l" ]; do
avg=$(ping -q -w 10 "$l" | sed '$!d;s_.*=[^/]*/\([^/]*\)/.*__')
echo "Average respond time for $l: $avg ms" >> avg_time
done < "urls"
Exemplo de execução
O script acima foi nomeado avg
aqui.
$ cat urls
askubuntu.com
unix.stackexchange.com
stackoverflow.com
$ ./avg
$ cat avg_time
Average respond time for askubuntu.com: 37.742 ms
Average respond time for unix.stackexchange.com: 35.966 ms
Average respond time for stackoverflow.com: 38.982 ms
Explicações
-
#!/bin/bash
o assim chamado shebang define qual shell seu script deve ser iniciado aqui estábash
-
while IFS='' read -r l || [ -n "$l" ]; do stuff; done < "urls"
read
o arquivo chamadourls
linha por linha, atribuindo o conteúdo da linha atualmente processada para a variávell
e fazendostuff
com ela -
ping -q -w 10 "$l"
(=ping -qw10 "$l"
)
chameping
com o conteúdo da variávell
como o argumento e as opções-q
uiet (menos saída que não precisamos) e-w 10
(tempo limite em segundos), para que o URL atualmente processado seja pingado para exatamente10
segundos - você pode ajustar este valor às suas necessidades, assim como especificar outras opções (vejaman ping
) para a lista) -
avg=$(ping … | sed …)
canalize a saída deping
parased
, que corta o tempo médio de resposta e salva esse valor na variávelavg
-
sed '$!d;s_.*=[^/]*/\([^/]*\)/.*__'
-
sed '$!d
não (!
)d
elete a última linha ($
), mas o resto inteiro -
sed 's/a/b/'
es
ubstitutea
porb
- também pode ser escrito como, por exemplo,sed 's_a_b_'
se for útil, dessa forma não precisamos evitar caracteres de barras literais nas strings-
.*
- leve tudo -
=
e/
- um literal "=" e "/" -
[^/]*
- pega tudo que não é (^
) uma barra -
\([^/]*\)
- pega tudo que não é (^
) uma barra e salva em um grupo -
- o primeiro grupo salvo com
\(…\)
antes
-
- o mesmo trabalho também pode ser feito com
awk -F/ '/^rtt/{print}'
:-
-F/
- define/
como o delimitadorF
ield -
/^rtt/{…}
- selecione o início da linha (^
) com "rtt" e faça…
com ele -
print
-print
somente no. %código%
-
-
-
5
imprima o texto inserindo o conteúdo das variáveisecho "Average respond time for $l: $avg ms" >> avg_time
el
e redirecione essa saída para o arquivoavg
anexando ao seu conteúdo