URLのリストがあり、それらがまだ機能するかどうかを確認する必要があります。私のためにそれを行うbashスクリプトを書きたいと思います。
返されるHTTPステータスコード(200、404、500など)のみが必要です。これ以上何もない。
EDITページに「404 not found」と表示されても200 OKメッセージが返される場合は問題があることに注意してください。これは、誤って設定されたWebサーバーですが、このケースを考慮する必要がある場合があります。
詳細については、 RLがテキスト「404」を含むページに移動するかどうかを確認する を参照してください。
Curlには、このための特定のオプション--write-out
があります。
$ curl -o /dev/null --silent --head --write-out '%{http_code}\n' <url>
200
-o /dev/null
は通常の出力を破棄します--silent
は進行状況メーターを破棄します--head
は、GETの代わりにHEAD HTTP要求を作成します--write-out '%{http_code}\n'
は、必要なステータスコードを出力しますこれを完全なBashスクリプトにまとめるには:
#!/bin/bash
while read LINE; do
curl -o /dev/null --silent --head --write-out "%{http_code} $LINE\n" "$LINE"
done < url-list.txt
(Eagle-eyedの読者は、これがURLごとに1つのcurlプロセスを使用することに気付くでしょう。これはforkとTCP接続ペナルティを課します。 curlがこれを行うために必要なオプションのモンスターの繰り返しを書き出すため)
wget --spider -S "http://url/to/be/checked" 2>&1 | grep "HTTP/" | awk '{print $2}'
状態コードのみを出力します
フィルが既に提供した答えを拡張します。呼び出しにxargsを使用する場合、並列処理を追加することはbashで簡単に行えます。
ここにコード:
xargs -n1 -P 10 curl -o /dev/null --silent --head --write-out '%{url_effective}: %{http_code}\n' < url.lst
-n1:curl呼び出しの引数として(リストから)1つの値のみを使用します
-P1:常に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ファイルに出力するだけで、任意のオフィスツールにインポートできます。
これは、Alpine Linuxを含むほぼすべての場所に存在する、広く利用可能なwget
に依存しています。
wget --server-response --spider --quiet "${url}" 2>&1 | awk 'NR==1{print $2}'
説明は次のとおりです。
--quiet
Wgetの出力をオフにします。
ソース-wget manページ
--spider
[...]それはページをダウンロードせず、単にそれらが存在することを確認します。 [...]
ソース-wget manページ
--server-response
HTTPサーバーから送信されたヘッダーとFTPサーバーから送信された応答を印刷します。
ソース-wget manページ
彼らが--server-response
について言っていないのは、それらのヘッダー出力が 標準エラー(sterr) に出力されるため、 redirect がstdinに必要であるということです。
出力を標準入力に送信し、awk
にパイプしてHTTPステータスコードを抽出できます。そのコードは次のとおりです。
$2
)文字の非空白グループ:{$2}
NR==1
そして、それを印刷したいので... {print $2}
。
wget --server-response --spider --quiet "${url}" 2>&1 | awk 'NR==1{print $2}'
curl
を使用して、HTTPヘッダーのみ(ファイル全体ではなく)をフェッチし、解析します。
$ curl -I --stderr /dev/null http://www.google.co.uk/index.html | head -1 | cut -d' ' -f2
200
wget -S -i *file*
は、ファイル内の各URLからヘッダーを取得します。
ステータスコードのgrep
をフィルタリングします。