Isso, 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"reado arquivo chamadourlslinha por linha, atribuindo o conteúdo da linha atualmente processada para a variávelle fazendostuffcom ela -
ping -q -w 10 "$l"(=ping -qw10 "$l")
chamepingcom o conteúdo da variávellcomo o argumento e as opções-quiet (menos saída que não precisamos) e-w 10(tempo limite em segundos), para que o URL atualmente processado seja pingado para exatamente10segundos - você pode ajustar este valor para as suas necessidades e especificar outras opções (vejaman ping) para a lista) -
avg=$(ping … | sed …)
canalize a saída depingparased, que corta o tempo médio de resposta e salva esse valor na variávelavg-
sed '$!d;s_.*=[^/]*/\([^/]*\)/.*__' -
sed '$!d
não (!)delete a última linha ($), mas o resto inteiro -
sed 's/a/b/'esubstituteaporb- 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$5}':-
-F/- define/como o delimitadorField -
/^rtt/{…}- selecione o início da linha (^) com “rtt” e faça…com ele -
print$5-printapenas no. %código%
-
-
-
5
imprima o texto inserindo o conteúdo das variáveisecho "Average respond time for $l: $avg ms" >> avg_timeele redirecione essa saída para o arquivoavganexando ao seu conteúdo