У меня есть a .txt
файл с 5 URL в нем. Я хочу считать его линию за линией, и выполнить 4 запроса ping на каждый сайт и извлечь время. Код, который я написал, ниже, но он не работает.
Кто-либо может дать мне подсказку?
#!/bin/bash
cat /home/akis/Desktop/sites.txt
declare -i var=1
while read -r line
do
while $var <= 5
do
var2=$((var2+1))
name="$line" | ping -c 4 $name > $var.txt | awk '{ print $8 }' < $var.txt | awk '/time/' > $var2.txt | tr '=' '\t' < $var2.txt | awk '{ print $2 }' > $var2.txt
done
var=$((var+1))
done
Ответ этого, а также Sergiy прибыл из Цикла по текстовому файлу с URL, и выполните ping на каждом.
Принятие файла urls
находится в текущем каталоге и содержит Ваши URL только, один на строку:
#!/bin/bash
while IFS='' read -r l || [ -n "$l" ]; do
avg=$(ping -q -w 10 "$l" | sed '$!d;s_.*=[^/]*/\([^/]*\)/.*_\1_')
echo "Average respond time for $l: $avg ms" >> avg_time
done < "urls"
Выше сценария был назван avg
здесь.
$ 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
#!/bin/bash
bash
while IFS='' read -r l || [ -n "$l" ]; do stuff; done < "urls"
read
файл называют urls
линию за линией, присваивая содержание в настоящее время обрабатываемой строки к переменной l
и выполнение stuff
с нимping -q -w 10 "$l"
(= ping -qw10 "$l"
)ping
с содержанием переменной l
как аргумент и опции -q
uiet (менее вывод нам не нужно), и -w 10
(тайм-аут в секундах), так, чтобы в настоящее время обрабатываемый URL был проверен с помощью ping-запросов для точно 10
секунды – можно скорректировать это значение к потребностям, а также указать другие опции (см. man ping
) для списка) avg=$(ping … | sed …)
передайте вывод по каналу ping
кому: sed
который отключает среднее число, отвечают время и сохраняют это значение в переменной avg
sed '$!d;s_.*=[^/]*/\([^/]*\)/.*_\1_'
sed '$!d
!
) d
элита последняя строка ($
), но целый отдыхsed 's/a/b/'
s
замена a
b
– может также быть записан как, например. sed 's_a_b_'
если полезный, этот путь мы не должны выходить из литеральных символов наклонной черты в строках .*
– возьмите все=
и /
– литерал “=” и “/”[^/]*
– возьмите все, что это не (^
) наклонная черта\([^/]*\)
– возьмите все, что это не (^
) наклонная черта и сохраняет его в группе\1
– первая группа, сохраненная с \(…\)
преждеawk -F/ '/^rtt/{print$5}'
: -F/
– определить /
как F
разделитель ield/^rtt/{…}
– выберите начало строки (^
) с “rtt” и делают …
с нимprint$5
– print
только поле нет. 5
echo "Average respond time for $l: $avg ms" >> avg_time
распечатайте текст, вставляющий содержание переменных l
и avg
и перенаправьте этот вывод в файл avg_time
добавление к его содержанию
Для единственной простой команды такой как ping
, можно использовать xargs
. Прохладная вещь о xargs
это, это имеет --arg-file
опция, которая позволяет Вам указывать файл который xargs
будет использовать для обеспечения позиционных параметров команде, которую Вы пытаетесь выполнить; в Вашем случае, который был бы одним сайтом на строку в текстовом файле.
Конкретно команда, которую Вы хотите, является этим:
xargs -I% --arg-file=./input.txt ping -c 4 %
-I
позволяет нам выбирать заполнителя для каждого аргумента, который xargs
внутренне будет--arg-file
файл, из которого позиционные параметры прибудут из; обратите внимание, что мы используем ./
указать, что файл расположен в текущем рабочем каталогеping -c 4
попытается ping
каждый сайт, который прибывает из input.txt
с 4 пакетамиОбратите внимание, что мы можем также использовать -q
опция к ping
это предотвратит печать строки для каждого пакета, получил/передал, при этом только статистика была произведена. Оттуда мы можем очистить вывод еще больше с awk
или любая другая относящаяся к обработке текстов утилита (имеют в виду, что производит, будет буферизована при движении через канал и ожидании ping
чтобы на самом деле закончить и произвести статистику, так обнаружится на немного медленном экране):
$ xargs -I% --arg-file=./input.txt ping -c 4 % -q | awk '/^---/||/avg/'
--- askubuntu.com ping statistics ---
rtt min/avg/max/mdev = 49.677/73.403/94.312/19.276 ms
--- unix.stackexchange.com ping statistics ---
rtt min/avg/max/mdev = 40.015/59.099/115.545/32.590 ms
--- stackoverflow.com ping statistics ---
rtt min/avg/max/mdev = 40.130/40.878/42.685/1.056 ms
$ xargs -I% --arg-file=./input.txt ping -c 4 % -q | awk -F'[ /]' '/^---/{print $2};/avg/{print $8}'
askubuntu.com
39.809
unix.stackexchange.com
189.557
stackoverflow.com
161.974