Bash에서 snmpwalk 루프

Bash에서 snmpwalk 루프

snmpwalk를 사용한 출력에 문제가 있었기 때문에 다음 스크립트에서 시도해 보았습니다.

var=`snmpwalk -v2c -c private ${ip} .1.1.1.6`
echo "${hostname}=>${var}"

다음과 같은 결과가 나왔습니다.

R1=>Gauge32: 240
R1=>Gauge32: 293
R1=>Gauge32: 255
R1=>Gauge32: 25

하지만 실제로는 다음과 같은 출력이 있습니다.

R1=>Gauge32: 240
Gauge32: 293
Gauge32: 255
Gauge32: 25

그렇다면 Bash에서 필요한 출력을 어떻게 얻을 수 있습니까?

답변1

문자열에 저장된 모든 줄 앞에 호스트 이름을 인쇄하면 원하는 대로 작동하지 않습니다 $var. 각 줄 앞에 호스트 이름을 반복하고 인쇄하는 대신.

파이프와 awk를 사용하여 루프를 반복하는 한 가지 방법은 다음과 같습니다.

snmpwalk -v2c -c private ${ip} .1.1.1.6 | awk -vHost="${hostname}" '{print Host"=>"$0}'

답변2

출력을 전체적으로 (개행 문자 포함) 저장하는 대신스칼라변수, 당신은 할 수 있습니다 (나는 당신을 말하지 않았다~해야 한다) 행을 배열 변수에 저장합니다.

시뮬레이션에서 ksh93, mksh, , 사용 bash:zshsh

IFS='
' # split on newline
set -f
var=($(snmpwalk -v2c -c private "$ip" .1.1.1.6))

그런 다음 다음과 같이 사용하십시오 printf.

printf "$hostname=>%s\n" "${var[@]}"

그러나 이는 $hostname퍼센트 또는 백슬래시 문자가 포함되어 있지 않다고 가정합니다.

rczsh더 쉽게 만드십시오 .

  • rc:

    var = (``('
    '){snmpwalk -v2c -c private $ip .1.1.1.6})
    printf %s\n $hostname'=>'^$var
    
  • zsh:

    var=(${(f)"$(snmpwalk -v2c -c private $ip .1.1.1.6)"})
    printf '%s\n' $hostname'=>'$^var
    

(이러한 모든 솔루션은 빈 줄을 무시합니다.)

답변3

명령의 전체 출력을 변수에 할당한 다음 형식을 지정하는 것은 좋은 생각이 아니라고 생각합니다. 하지만 그렇게 하려면 printf. 핵심은 hostname형식 문자열 내부를 확장하여유형 값쌍은 var형식 지정자의 영향을 받으며(이 경우) %s각 데이터 쌍에 대해 형식 지정자를 재사용하도록 보장됩니다.%dprintf

var=`snmpwalk -v2c -c private ${ip} .1.1.1.6`
printf "${hostname}=>%s %d\n" ${var}

${var}(참고: 이 경우에는 따옴표가 없습니다.)

관련 정보