目的:1) リターン名前2 <a>
)複数のHTMLテーブル行のセル値を評価し、条件付きで0または1を返します。
これにより、curl -s http://[server-fqdn]/stats/servers?t=db | grep 'tr class="server"
コードスニペットに示すように、異なる数の行が返されます。この例では、データベース・サーバーをリストします。
ライン彫刻(注:行全体の文字数は2,000〜2,150文字です。)
<tr class="server"><td class=val><a name="srv_backend_3306/server"></a></td> [cut away] <td class=val>1d3h UP</td>
挑戦:価値抽出名前最初のタグ<a>
の内容を評価します<td class=val></td>
(単語UPが含まれている場合は0を返し、それ以外の場合は1を返します)。
上記のカールコマンドを拡張、追加、インポート| cut -d\> -f3 | cut -d\" -f2
できます。名前- しかし、どのように異なる結果を得ることができますか?セルには一意の識別子がなく、cut
テーブル作成の動的性質のために使用しても正確に縮小されません。
答え1
ここで少し破片それからインスピレーションを得ましたStackOverflow 回答これをネイティブbashで使用できます。入力を読み取った後、他の関数を使用して解析する関数があります。ドームコンテンツ:
#!/bin/bash
cr=1
ac=""
read_dom () {
local IFS=\>
read -d \< ENTITY CONTENT
local ret=$?
TAG_NAME=${ENTITY%% *}
ATTRIBUTES=${ENTITY#* }
return $ret
}
parse_dom () {
if [[ $TAG_NAME == "a" ]] ; then
eval local $ATTRIBUTES
ac=`cut -d "=" -f2 <<< "$ATTRIBUTES" | tr -d '"'`
fi
if [[ $TAG_NAME == "td" && "$(cut -d= -f1 <<< $ATTRIBUTES)" == "class" && $CONTENT == *"UP"* ]] ; then
cr=0
fi
}
while read_dom; do
parse_dom
done <<< "$(curl -s http://[server-fqdn]/stats/servers?t=db | grep 'tr class="server")"
echo "<a> tag content : $ac"
echo "return value for <td> check : $cr"
出力:
<a> tag content : srv_backend_3306/server
return value for <td> check : 0
答え2
解決策が見つかりました。問題は解決されましたが、自由に改善を提案してください。 ;)
#!/bin/bash
curl -s http://[server-fqdn]/stats/servers?t=db | grep 'tr class="server"' > hastats.html
for i in `cat hastats.html | grep 'tr class="server"' | cut -d\> -f3 | cut -d\" -f2` ; do
grep $i hastats.html | ( ! grep -P " UP" -q)
echo $i $?
done
このサーバーの場合、srv_backend_3306 1
これは、たとえば、その特定の行にスペースが続く単語UPがあることが確認されたことを意味します。この場合、この特定の単語が存在しないか、特定の行ごとに一度だけ表示されると確信しています。
否定的な! grep -P ' UP' -q
エラーコードが返されました。通常、「0」は「発見が発生しました」を意味します。特定の理由で「1」を返したいと思います。
あなたの建設的なコメントに感謝します。