Как проверить состояние URL-адресов из текстового файла с помощью скрипта оболочки bash

Я должен проверить статус 200 http-адресов и узнать, какие из них являются сломанными ссылками. Ссылки присутствуют в простом текстовом файле (скажем, URL.txt, который присутствует в моей папке~). Я использую Ubuntu 14.04 и я новичок в Linux. Но я понимаю, что оболочка bash очень мощная и может помочь мне достичь того, чего я хочу.

моим точным требованием было бы прочитать текстовый файл, который имеет список URL-адресов и автоматически проверить, работают ли ссылки, и написать ответ на новый файл с URL-адресами и соответствующим им статусом (рабочий / сломанный).

4 ответов


Я создал файл "checkurls.sh" и поместил его в мой домашний каталог, где URL-адреса.txt файл находится. Я дал привилегии execute файлу, используя

$chmod +x checkurls.sh

содержание checkurls.sh приведено ниже:

#!/bin/bash
while read url
do
    urlstatus=$(curl -o /dev/null --silent --head --write-out '%{http_code}' "$url" )
    echo "$url  $urlstatus" >> urlstatus.txt
done < 

наконец, я выполнил его из командной строки, используя следующий -

$./checkurls.sh urls.txt

вуаля! Это работает.


#!/bin/bash
while read -ru 4 LINE; do
    read -r REP < <(exec curl -IsS "$LINE" 2>&1)
    echo "$LINE: $REP"
done 4< ""

использование:

bash script.sh urls-list.txt

пример:

http://not-exist.com/abc.html
https://kernel.org/nothing.html
http://kernel.org/index.html
https://kernel.org/index.html

выход:

http://not-exist.com/abc.html: curl: (6) Couldn't resolve host 'not-exist.com'
https://kernel.org/nothing.html: HTTP/1.1 404 Not Found
http://kernel.org/index.html: HTTP/1.1 301 Moved Permanently
https://kernel.org/index.html: HTTP/1.1 200 OK

для всего, прочитайте Руководство Bash. См.man curl, help, man bash как хорошо.


как насчет добавления некоторого параллелизма к принятому решению. Позволяет изменить скрипт chkurl.sh чтобы быть немного легче читать и обрабатывать только один запрос за раз:

#!/bin/bash
URL=${1?Pass URL as parameter!}
curl -o /dev/null --silent --head --write-out "$URL %{http_code} %{redirect_url}\n" "$URL"

и теперь вы проверяете свой список, используя:

cat URL.txt | xargs -P 4 -L1 ./chkurl.sh

Это может закончить работу в 4 раза быстрее.


Если ваш входной файл содержит один url на строку, вы можете использовать скрипт для чтения каждой строки, а затем попробуйте пинговать url, если успех пинга, то url действителен

#!/bin/bash
INPUT="Urls.txt"
OUTPUT="result.txt"
while read line ;
do
  if ping -c 1 $line &> /dev/null
  then
      echo "$line valid" >> $OUTPUT
  else
      echo "$line not valid " >> $OUTPUT
  fi
done < $INPUT
exit

ping параметры :

-c count
      Stop after sending count ECHO_REQUEST packets. With deadline option, ping waits for count ECHO_REPLY packets, until the timeout expires.

вы также можете использовать эту опцию, чтобы ограничить время ожидания

 -W timeout
      Time to wait for a response, in seconds. The option affects only timeout in absense
      of any responses, otherwise ping waits for two RTTs.