脚本获取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的状态码。