web-dev-qa-db-ja.com

bashシェルスクリプトを使用してテキストファイルからURLのステータスを確認する方法

200個のhttp URLのステータスをチェックして、リンク切れの原因を特定する必要があります。リンクは単純なテキストファイルに存在します(たとえば、〜フォルダーに存在するURL.txt)。私はUbuntu 14.04を使用していますが、Linux初心者です。しかし、私はbashシェルが非常に強力であり、私が望むものを達成するのを助けることができることを理解しています。

私の正確な要件は、URLのリストが含まれているテキストファイルを読み取り、リンクが機能しているかどうかを自動的に確認し、URLとそれに対応するステータス(動作中/破損)を含む新しいファイルに応答を書き込むことです。

11
Jayakrishnan GK

「checkurls.sh」というファイルを作成して、urls.txtファイルもあるホームディレクトリに配置しました。私は使用してファイルに実行権限を与えました

$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 < $1

最後に、コマンドラインから次のように実行しました-

$./checkurls.sh urls.txt

出来上がり!できます。

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

使用法:

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 Manual をお読みください。見る man curlhelpman bash 同じように。

6
konsolebox

受け入れられたソリューションにいくつかの並列処理を追加するのはどうでしょうか。スクリプトを変更してみましょうchkurl.sh読みやすく、一度に1つの要求のみを処理するために:

#!/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倍速く完了できます。

3
brablc

これで、引数として渡されたファイルにリストされているURLをチェックする私の完全なスクリプト(例: 「checkurls.sh listofurls.txt」。

それがすること:

  • curlを使用してURLを確認し、HTTPステータスコードを返す
  • uRLが200以外のコードを返したときにメール通知を送信する
  • 失敗したURLの一時ロックファイルを作成します(ファイルの命名を改善することができます)
  • uRLが再び利用可能になったときに電子メール通知を送信する
  • 今後の通知を回避するためにURLが使用可能になったらロックファイルを削除します
  • イベントをファイルに記録し、増加するログファイルサイズを処理する(別名ログローテーション、コード200のログが必要な場合はコメントエコーを解除する)

コード:

#!/bin/sh

EMAIL=" [email protected]"
DATENOW=`date +%Y%m%d-%H%M%S`
LOG_FILE="checkurls.log"
c=0

while read url
do
  ((c++))
  LOCK_FILE="checkurls$c.lock"
  urlstatus=$(/usr/bin/curl -H 'Cache-Control: no-cache' -o /dev/null --silent --head --write-out '%{http_code}' "$url" )

  if [ "$urlstatus" = "200" ]
   then
    #echo "$DATENOW OK $urlstatus connection->$url" >> $LOG_FILE
    [ -e $LOCK_FILE ] && /bin/rm -f -- $LOCK_FILE > /dev/null && /bin/mail -s "NOTIFICATION URL OK: $url" $EMAIL <<< 'The URL is back online'
else
    echo "$DATENOW FAIL $urlstatus connection->$url" >> $LOG_FILE
    if [ -e $LOCK_FILE ]
     then
        #no action - awaiting URL to be fixed
        :
    else
        /bin/mail -s "NOTIFICATION URL DOWN: $url" $EMAIL <<< 'Failed to reach or URL problem'
        /bin/touch $LOCK_FILE
    fi
  fi
done < $1

# REMOVE LOG FILE IF LARGER THAN 100MB
# alow up to 2000 lines average
maxsize=120000
size=$(/usr/bin/du -k "$LOG_FILE" | /bin/cut -f 1)
if [ $size -ge $maxsize ]; then
     /bin/rm -f -- $LOG_FILE > /dev/null
     echo "$DATENOW LOG file [$LOG_FILE] has been recreated" > $LOG_FILE
else
     #do nothing
     :
fi

テキストファイル内のリストされたURLの順序を変更すると、既存のロックファイルに影響することに注意してください(混乱を避けるために、すべての.lockファイルを削除してください)。ファイル名としてurlを使用することで改善されますが、次のような特定の文字:@ /? &オペレーティングシステムで処理する必要があります。

0
webcoder.eu

入力ファイルに1行あたり1つのURLが含まれている場合は、スクリプトを使用して各行を読み取ってから、URLにpingを実行できます。pingが成功した場合、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.
0
bachN