Cisco 장치를 모니터링하고 있는데 snmp 출력을 구문 분석하여 더 자세한 별도의 줄로 인쇄해야 합니다.
명령줄에서 다음을 수행할 수 있습니다.
snmpwalk -m /usr/share/snmp/mibs/CISCO-UNIFIED-COMPUTING-STORAGE-MIB.my -v2c -c opennms-Priv X.X.X.X .1.3.6.1.4.1.9.9.719.1.45.4.1.18 2>/dev/null | awk '{print $4}' | while read -r line ; do echo "Drive $line" ; done
Drive online(1)
Drive online(1)
Drive online(1)
Drive online(1)
Drive online(1)
Drive online(1)
Drive online(1)
Drive online(1)
Drive online(1)
Drive online(1)
Drive online(1)
Drive online(1)
Drive online(1)
Drive online(1)
Drive online(1)
Drive online(1)
그러나 스크립트에서 동일한 콘텐츠를 사용하는 경우:
#!/bin/bash
Output=`snmpwalk -m /usr/share/snmp/mibs/CISCO-UNIFIED-COMPUTING-STORAGE-MIB.my -v2c -c opennms-Priv 10.201.1.131 .1.3.6.1.4.1.9.9.719.1.45.4.1.18 2>/dev/null | awk '{print $4}'`
while read -r line ; do
echo "Drive $line";
done << $Output
알겠어요,
bash -x CIMC-Monitong.sh
++ snmpwalk -m /usr/share/snmp/mibs/CISCO-UNIFIED-COMPUTING-STORAGE-MIB.my -v2c -c opennms-Priv X.X.X.X .1.3.6.1.4.1.9.9.719.1.45.4.1.18
++ awk '{print $4}'
+ Output='online(1)
online(1)
online(1)
online(1)
online(1)
online(1)
online(1)
online(1)
online(1)
online(1)
online(1)
online(1)
online(1)
online(1)
online(1)
online(1)'
CIMC-Monitong.sh: line 9: warning: here-document at line 7 delimited by end-of-file (wanted `$Output')
+ read -r line
+ echo 'Drive '
Drive
+ read -r line
+ echo 'Drive '
Drive
+ read -r line
내가 무엇을 놓치고 있나요?
편집: 파이핑하지 않는 이유는 이제 다음과 유사한 출력을 얻기 때문입니다.
온라인 운전(1) 온라인 운전(1) 온라인 운전(1) 온라인 운전(1) 온라인 운전(1) 온라인 운전(1) 온라인 운전(1) 온라인 운전(1) 온라인 운전(1) 온라인 운전(1) 온라인 운전(1) 온라인 운전(1) 온라인 운전(1) 온라인 운전(1) 온라인 운전(1) 온라인 운전(1)
하지만 나는 다음과 같은 것을 기대합니다.
드라이브 1 온라인 (1) 드라이브 2 온라인 (1) 드라이브 3 온라인 (1) 드라이브 4 온라인 (1) 드라이브 5 온라인 (1) 드라이브 6 온라인 (1) 드라이브 7 온라인 (1) 드라이브 8 온라인 (1) 드라이브 9 온라인(1) 드라이브10온라인(1) 드라이브11 온라인(1) 드라이브12 온라인(1) 드라이브13 온라인(1) 드라이브14 온라인(1) 드라이브15 온라인(1) 드라이브16 온라인(1)
답변1
여기서는 스크립트의 가 <<$Output
문서의 시작 부분으로 해석됩니다.
일반적으로 여기 문서는 다음과 같이 작성됩니다.
cat <<END_OF_INPUT
.
.
.
.
END_OF_INPUT
...하지만 $Output
여기에서는 문서 구분 기호로 다른 문자열을 사용해도 괜찮습니다.
을 사용하려고 할 수도 있지만 이는 파일 이름이 아니라 파이프의 출력인 <$Output
파일에서 읽으려는 시도로 처리되므로 잘못된 것입니다 .$Output
명령줄에서와 마찬가지로 출력을 while 루프로 파이프해 보세요.
#!/bin/bash
snmpwalk -m /usr/share/snmp/mibs/CISCO-UNIFIED-COMPUTING-STORAGE-MIB.my \
-v2c -c opennms-Priv X.X.X.X .1.3.6.1.4.1.9.9.719.1.45.4.1.18 2>/dev/null |
awk '{print $4}' |
while read -r line; do
echo "Drive $line"
done
나는 출력에 사용자 제공 데이터(실제로는 스크립트 외부의 모든 데이터)가 포함되어야 할 때 printf
대신 사용하는 경향이 있습니다 .echo
printf 'Drive %s\n' "$line"
바라보다"왜 printf가 echo보다 나은가요?"
고쳐 쓰다:
출력이 다음과 같아야 하는 경우
Drive1 online(1)
Drive2 online(1)
... etc.
각 행은 1씩 엄격하게 증가하므로 Drive
루프에 카운터가 필요합니다.
while read -r line; do
printf 'Drive%d %s\n' "$(( ++count ))" "$line"
done