rrd의 문자열에 정수 값을 저장합니다.

rrd의 문자열에 정수 값을 저장합니다.

10분마다 DSL 모뎀에서 통계를 수집하고 싶습니다. 많은 웹사이트에 따르면 이러한 목적으로 rrd를 사용하는 것이 가장 좋습니다. 내 모뎀(TD-W8968)은 SNMP를 사용할 수 없으므로 텔넷을 통해 통계를 가져오는 예상 스크립트를 작성했습니다. 수집된 crontab이 설정되었습니다. 내 문제는 일등석으로 불필요한 행을 잘라낸 후 통계 출력이 다음과 같다는 것입니다.

Status: Showtime
Last Retrain Reason:    0
Last initialization procedure status:   0
Max:    Upstream rate = 1080 Kbps, Downstream rate = 11128 Kbps
Channel:        FAST, Upstream rate = 512 Kbps, Downstream rate = 2048 Kbps

Link Power State:       L0
Mode:                   G.DMT 
TPS-TC:                 ATM Mode
Trellis:                ON
Line Status:            No Defect
Training Status:        Showtime
                Down            Up
SNR (dB):        21.8            12.0
Attn(dB):        26.0            15.0
Pwr(dBm):        5.1             4.0

답변1

당신은 그것을 사용할 수 있습니다그러한 상황을 처리하기 위해. 예를 들어, 원본 파일에서 2개의 SNR 및 2개의 Attn 번호를 추출하여 rrd에 내림차순, 오름차순으로 공급하려면 다음을 수행하세요.

awk '/^SNR/  { snrdown = $3; snrup = $4; }
     /^Attn/ { attndown = $2; attnup = $3; }
     END     { data = sprintf("N:%s:%s:%s:%s", snrdown, attndown, snrup, attnup);
               system("rrdtool update " data " myrrdfile");
             }' <rawfile

awk의 첫 번째 줄은 "SNR"로 시작하는 줄만 일치합니다. 기본적으로 awk는 줄을 공백으로 구분된 필드로 분할합니다. 필드 번호는 1부터 시작됩니다. 따라서 이 예에서 $3은 21.8의 필드입니다. 이 값은 임의로 이름이 지정된 변수에 보관됩니다.

마찬가지로 두 번째 awk 줄은 "Attn" 줄에만 일치하지만 해당 줄과 "(dB)" 사이에 공백이 없으므로 첫 번째 숫자는 $2 필드에 있습니다.

파일의 모든 행을 읽은 후 END 섹션을 완료하십시오 rawfile. rrd에 대한 데이터 문자열을 생성합니다(N:21.8:26.0:...과 같은 것이 필요함). 형식 문자열의 각 요소는 %s형식 뒤에 오는 변수 중 하나로 대체됩니다.

awk는 알아둘 가치가 충분히 있습니다. 매우 다양합니다.

관련 정보