脚本获取URL列表的HTTP状态代码?
我有一个URLS列表,我需要检查,看看他们是否仍然工作。 我想写一个bash脚本,为我做到这一点。
我只需要返回的HTTP状态码,即200,404,500等等。 而已。
编辑请注意有一个问题,如果页面显示“404找不到”,但返回200 OK消息。 这是一个configuration错误的networking服务器,但你可能不得不考虑这种情况。
有关更多信息,请参阅检查URL是否转到包含文本“404”的页面
curl有一个特定的选项, --write-out
,为此:
$ curl -o /dev/null --silent --head --write-out '%{http_code}\n' <url> 200
-
-o /dev/null
抛出通常的输出 -
--silent
丢掉进度表 -
--head
进行HEAD HTTP请求,而不是GET -
--write-out '%{http_code}\n'
打印所需的状态码
把它包装在一个完整的脚本中:
#!/bin/bash while read LINE; do curl -o /dev/null --silent --head --write-out '%{http_code}' "$LINE" echo " $LINE" done < url-list.txt
(鹰眼的读者会注意到,这对每个URL使用一个curl过程,这会产生fork和TCP连接的惩罚,如果多个URL被合并成单个curl,速度会更快,但是没有空间写出怪异的重复curl要求做的选项)。
wget --spider -S "http://url/to/be/checked" 2>&1 | grep "HTTP/" | awk '{print $2}'
只打印你的状态码
扩展Phil已经提供的答案。 如果在调用中使用xargs,则在bash中添加并行性在bash中是毫不费力的。
这里代码:
xargs -n1 -P 10 curl -o /dev/null --silent --head --write-out '%{url_effective}: %{http_code}\n' < url.lst
-n1 :只使用一个值(从列表中)作为curl调用的参数
-P10 : 随时保持10个curl过程(即10个并行连接)
检查curl手册中的write_out
参数以获取更多可以使用它提取的数据(时间等)。
如果它帮助某人这是我目前使用的呼叫:
xargs -n1 -P 10 curl -o /dev/null --silent --head --write-out '%{url_effective};%{http_code};%{time_total};%{time_namelookup};%{time_connect};%{size_download};%{speed_download}\n' < url.lst | tee results.csv
它只是输出一堆数据到一个CSV文件,可以导入到任何办公室工具。
使用curl
仅获取HTTP头(而不是整个文件)并parsing它:
$ curl -I --stderr /dev/null http://www.google.co.uk/index.html | head -1 | cut -d' ' -f2 200
wget -S -i *file*
将从您的文件中的每个url的标题。
具体过滤grep
的状态码。