Перебрать файл с URL и получить HTTP-код для каждого URL

Рейтинг: 1Ответов: 2Опубликовано: 10.07.2023

У меня есть текстовый файл url.txt содержащий URL на новой строке и ничего больше.

https://ru.stackoverflow.com
https://stackoverflow.com
https://meta.stackoverflow.com

Мне нужно получить HTTP-код каждого URL.

curl -ILks https://ru.stackoverflow.com | awk '/^HTTP/{print $2}'
curl -ILks https://stackoverflow.com | awk '/^HTTP/{print $2}'
curl -ILks https://meta.stackoverflow.com | awk '/^HTTP/{print $2}'

И получить на выходе такой ответ

200 https://ru.stackoverflow.com
200 https://stackoverflow.com 
200 https://meta.stackoverflow.com

Помогите написать изящный скрипт, который получает на вход файл url.txt и в stdout выводит нужный ответ.

Как в bash перебирать построчно текстовый файл испльзуя из него строку в кач-ве аргумента и можно ли это сделать с помощью awk и/или sed?

Ответы

▲ 1Принят
awk '{system("curl -o /dev/null -ILksw \"%{http_code} \" "$0";echo "$0)}' url.txt

п.с

если порядок вывода проверки URL не имеет значения то можно еще добавить ключ -Z, --parallel что ускорит получения значений:

awk '{system("curl -o /dev/null -IZLksw \"%{http_code} \" "$0";echo "$0)}' url.txt

а для еще большего ускорения можно передавать адреса через xargs а для awk оставить тока окончательную фильтрацию:

xargs <url.txt curl -IZLksw '+ %{http_code} %{url_effective}\n' |awk '$1=="+"{print $2,$3}'

последний вариант по сравнению с первым у меня отрабатывает в два раза быстрее. ( можно примерно оценить с помощью утилиты time (...) )

▲ 5

Получить нужный формат вывода можно и без обработчиков текста вроде awk или sed, curl подразумевает формировать ответ программы:

-w '%{http_code} %{url_effective}'

для того что бы сделать скрипт считывающий из файла url и возвращал данные в stdout достаточно сделать цикл:

while read url; do
    curl -o /dev/null -s -w '%{http_code} %{url_effective}\n' "$url"
done < url.txt

http_code - возвращает код ответа HTTP
url - используемый при передаче URL, появился в версии curl 7.75.0
url_effective - возвращает последний полученный url, следует учитывать при использовании опции -L

Если версия curl ниже 7.75.0 и нужны адреса из url.txt, то цикл можно сделать следующим образом:

while read url; do
    curl -o /dev/null -s -w "%{http_code} $url\n" "$url"
done < url.txt

Где мы просто подставляем переменную считанную из файла построчно