Как читать URL-адреса на отдельных строках в файле .text и пинговать каждый

Секторы вашего жесткого диска повреждены. DRDY ERR - Ошибка проверки готовности устройства. UNC - Неисправляемый.

Из-за различных причин, таких как резкое прекращение во время расширенной записи, высокая температура, операции чтения записи и качество жесткого диска в этом случае играют важную роль.

Как только сектор поврежден, и если ядро ​​пытается получить доступ к этим секторам, вы получите эту ошибку.

Вы можете использовать seatools, чтобы временно восстановить эту ошибку. Но вам не удастся исправить эту проблему навсегда. Это может произойти снова несколько раз позже.

Если вам повезет, это не будет повторяться в течение нескольких дней.

Лучшее резервное копирование данных на новый жесткий диск и заменить жесткий диск.

6
задан 22 November 2017 в 21:32

6 ответов

Этот ответ, как и ответ Сергия, пришел из Loop над текстовым файлом с 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"

Пример run

Здесь выше сценарий был назван 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 эта так называемая shebang определяет, с какой оболочки должен запускаться ваш скрипт, вот это 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-адрес пингуется точно 10 секунд - вы можете настроить это значение на свой а также указать другие параметры (см. man ping) для списка) avg=$(ping … | sed …) вывести выходной сигнал от ping до sed, который вырезает среднее время ответа и сохраняет это значение в переменной avg sed '$!d;s_.*=[^/]*/\([^/]*\)/.*_\1_' sed '$!d не (!) d elete последняя строка ($), но весь остаток sed 's/a/b/' s ubstitute a на b - также может быть записан, например, sed 's_a_b_', если это полезно, таким образом нам не нужно избегать буквенных символов косой черты в строках .* - взять все = и / - буквальное «=» и «/» [^/]* - взять все это не (^) косая черта \([^/]*\) - возьмите все, что не является (^), косой чертой и сохраните ее в группе \1 - первая группа, сохраненная с \(…\), до того, как можно будет выполнить ту же работу с awk -F/ '/^rtt/{print$5}': -F/ - определить / как разделитель i F /^rtt/{…} - выбрать начало линии (^) с помощью «rtt» и сделать … с ним print$5 - print ] только поле no. 5 echo "Average respond time for $l: $avg ms" >> avg_time распечатать текст, вставляя содержимое переменных l и avg и перенаправлять этот вывод в файл avg_time, добавляя его содержимое
8
ответ дан 22 May 2018 в 16:09
  • 1
    не могли бы вы дать мне дополнительные пояснения по поводу этой части кода? sed '$! d; s _. * = [^ /] * / ([^ /] *) /.* \ 1 ') – Akis Tachmatzidis 22 November 2017 в 16:06
  • 2
    @AkisTachmatzidis Мое удовольствие! Я добавил подробные объяснения для выражений sed и альтернативы awk. Вы можете встретить меня в этом чате для дальнейших объяснений или другой помощи. – dessert 22 November 2017 в 21:17

Этот ответ, как и ответ Сергия, пришел из Loop над текстовым файлом с 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"

Пример run

Здесь выше сценарий был назван 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 эта так называемая shebang определяет, с какой оболочки должен запускаться ваш скрипт, вот это 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-адрес пингуется точно 10 секунд - вы можете настроить это значение на свой а также указать другие параметры (см. man ping) для списка) avg=$(ping … | sed …) вывести выходной сигнал от ping до sed, который вырезает среднее время ответа и сохраняет это значение в переменной avg sed '$!d;s_.*=[^/]*/\([^/]*\)/.*_\1_' sed '$!d не (!) d elete последняя строка ($), но весь остаток sed 's/a/b/' s ubstitute a на b - также может быть записан, например, sed 's_a_b_', если это полезно, таким образом нам не нужно избегать буквенных символов косой черты в строках .* - взять все = и / - буквальное «=» и «/» [^/]* - взять все это не (^) косая черта \([^/]*\) - возьмите все, что не является (^), косой чертой и сохраните ее в группе \1 - первая группа, сохраненная с \(…\), до того, как можно будет выполнить ту же работу с awk -F/ '/^rtt/{print$5}': -F/ - определить / как разделитель i F /^rtt/{…} - выбрать начало линии (^) с помощью «rtt» и сделать … с ним print$5 - print ] только поле no. 5 echo "Average respond time for $l: $avg ms" >> avg_time распечатать текст, вставляя содержимое переменных l и avg и перенаправлять этот вывод в файл avg_time, добавляя его содержимое
8
ответ дан 18 July 2018 в 03:07

Этот ответ, как и ответ Сергия, пришел из Loop над текстовым файлом с 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"

Пример run

Здесь выше сценарий был назван 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 эта так называемая shebang определяет, с какой оболочки должен запускаться ваш скрипт, вот это 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-адрес пингуется точно 10 секунд - вы можете настроить это значение на свой а также указать другие параметры (см. man ping) для списка) avg=$(ping … | sed …) вывести выходной сигнал от ping до sed, который вырезает среднее время ответа и сохраняет это значение в переменной avg sed '$!d;s_.*=[^/]*/\([^/]*\)/.*_\1_' sed '$!d не (!) d elete последняя строка ($), но весь остаток sed 's/a/b/' s ubstitute a на b - также может быть записан, например, sed 's_a_b_', если это полезно, таким образом нам не нужно избегать буквенных символов косой черты в строках .* - взять все = и / - буквальное «=» и «/» [^/]* - взять все это не (^) косая черта \([^/]*\) - возьмите все, что не является (^), косой чертой и сохраните ее в группе \1 - первая группа, сохраненная с \(…\), до того, как можно будет выполнить ту же работу с awk -F/ '/^rtt/{print$5}': -F/ - определить / как разделитель i F /^rtt/{…} - выбрать начало линии (^) с помощью «rtt» и сделать … с ним print$5 - print ] только поле no. 5 echo "Average respond time for $l: $avg ms" >> avg_time распечатать текст, вставляя содержимое переменных l и avg и перенаправлять этот вывод в файл avg_time, добавляя его содержимое
8
ответ дан 24 July 2018 в 17:45

Для одной простой команды, такой как 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
ответ дан 22 May 2018 в 16:09

Для одной простой команды, такой как 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
ответ дан 18 July 2018 в 03:07

Для одной простой команды, такой как 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
ответ дан 24 July 2018 в 17:45

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

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