HTML 테이블에서 데이터 추출

HTML 테이블에서 데이터 추출

목적: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"이 반환되기를 원합니다.

귀하의 건설적인 의견에 감사드립니다.

관련 정보