목적: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"이 반환되기를 원합니다.
귀하의 건설적인 의견에 감사드립니다.