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
:zsh
sh
IFS='
' # split on newline
set -f
var=($(snmpwalk -v2c -c private "$ip" .1.1.1.6))
그런 다음 다음과 같이 사용하십시오 printf
.
printf "$hostname=>%s\n" "${var[@]}"
그러나 이는 $hostname
퍼센트 또는 백슬래시 문자가 포함되어 있지 않다고 가정합니다.
rc
zsh
더 쉽게 만드십시오 .
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
각 데이터 쌍에 대해 형식 지정자를 재사용하도록 보장됩니다.%d
printf
var=`snmpwalk -v2c -c private ${ip} .1.1.1.6`
printf "${hostname}=>%s %d\n" ${var}
${var}
(참고: 이 경우에는 따옴표가 없습니다.)