Как я могу считать URL на отдельных строках в .txt файле и проверить с помощью ping-запросов каждого

У меня есть 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 
6
задан 22 November 2017 в 10:32

2 ответа

Ответ этого, а также 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 как аргумент и опции -quiet (менее вывод нам не нужно), и -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$5print только поле нет. 5
  • echo "Average respond time for $l: $avg ms" >> avg_time
    распечатайте текст, вставляющий содержание переменных l и avg и перенаправьте этот вывод в файл avg_time добавление к его содержанию

8
ответ дан 23 November 2019 в 07:20

Для единственной простой команды такой как 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
7
ответ дан 23 November 2019 в 07:20

Другие вопросы по тегам:

Похожие вопросы: