#Gives a list of servers and their instance
for server instance in `/swb/local/scripts/swdList -p SMARTS -a A5SV_2017.1b -e 1 --type=instance --function=SAM --priority=1 | grep -v sis`
do
echo "===== $server - $instance ====="
#Reason for single line, gotta run this on remote servers
sudo ssh $server "`/swb/local/scripts/amprov /swb/local/scripts/estools/getProperty -s $sam_instance ICS_Notification Active SourceDomainName 2>/dev/null | grep "Partition-" | grep TRUE | awk '{print $1}' | sed 's/NOTIFICATION-Partition_//' | sed 's/_Down//' | sort`; do echo "===== Partition alarm "$alarming_partition" on "$sam_instance" ====="; ampm_instance=`echo $alarming_partition | awk -F\/ '{print $2}'`; for device_in_partition in `/swb/opt/InCharge9/IP/smarts/bin/dmctl -s ${ampm_instance} get Partition:: ${alarming_partition}::ConsistsOf | tr ' ' '\n' | grep '::' | awk -F\: '{print $3}'`; do echo -n $device_in_partition; vzb_qap=`/swb/opt/InCharge9/IP/smarts/bin/dmctl -s ${ampm_instance} get UnitaryComputerSystem::${device_in_partition}::vzb_qap`; echo -n ",vzb_qap="$vzb_qap; device_alarm=`/swb/local/scripts/amprov /swb/local/scripts/estools/getProperty -s $sam_instance ICS_Notification Active SourceDomainName 2>/dev/null | grep TRUE | grep '_Down' | egrep -v '(Interface|BGP)' | grep $device_in_partition | awk '{print $1}'`; echo -n ",UCS_alarm="$device_alarm; echo; done;"
echo
done
추신: 답장을 보내주신 모든 분들께 진심으로 감사드립니다. 안타깝지만, 줄여서 덜 복잡해 보이도록 노력했지만 그게 제가 쓴 것입니다.
답변1
;
나는 그것을 한 줄로 만들기 위해 스크립트에 자유롭게 적용할 수 있을 만큼 오랫동안 울고 싶은 충동을 억제할 수 있었습니다 .
Y= [...]; for X in `shell command $Y`; do echo "=== "$X" on "$Y" ==="; Z=`echo $X | awk -F\/ '{print $2}'`; for W in `shell command ${Z} awk -F\: '{print $3}'`; do echo -n $W; V=`shell command ${Z} ${W}`; echo -n ",V="$V; U=`shell command $Y`; echo -n ",T="$U; echo; done; echo; done
또한: 적어도 Y= [...]
유효한 명령이 아니기 때문에 작동하지 않지만 다른 이유일 수도 있습니다.
답변2
귀하의 게시물 아래 댓글에 전적으로 동의하지만 먼저 가능한 한 짧게 작성하는 것이 좋습니다. 경우).
Y=[...]
for X in $(shell command $Y); do
echo ===\ $X\ on\ $Y\ ===
Z=$(echo $X | cut -d/ -f2)
for W in $(shell command $Z | cut -d: -f3); do
echo $W,V=$(shell command $Z $W),T=$(shell command $Y)
done
echo
done
그런 다음 필수(의미 있는) 줄 바꿈을 세미콜론(가독성을 위한 +공백)으로 바꾸면서 불필요한 식별자를 모두 제거합니다.
Y=[...]; for X in $(shell command $Y); do echo ===\ $X\ on\ $Y\ ===; Z=$(echo $X | cut -d/ -f2); for W in $(shell command $Z | cut -d: -f3); do echo $W,V=$(shell command $Z $W),T=$(shell command $Y); done; echo; done
가능한 한 짧게 만드는 것이 목표라면 불필요한 공백을 모두 제거할 수 있습니다.
Y=[...];for X in $(shell command $Y);do echo ===\ $X\ on\ $Y\ ===;Z=$(echo $X|cut -d/ -f2);for W in $(shell command $Z|cut -d: -f3);do echo $W,V=$(shell command $Z $W),T=$(shell command $Y);done;echo;done
또는 다르게 하고 싶다면 다음을 시도해 볼 수 있습니다.
Y=[...];shell command $Y|xargs -n1 bash -c "echo ===\\ \$1\\ on\\ $Y\\ ===;Z=\$(echo \$1|cut -d/ -f2);shell command \$Z|cut -d: -f3|xargs -n1 bash -c \"echo \\\$1,V=\\\$(shell command \$Z \\\$1),T=\\\$(shell command $Y)\";echo"
또는:
Y=[...];bash -c "for X in \$*;do echo ===\ \$X\ on\ \$*\ ===;bash -c \"for W in \\\$(shell command \\\$*|cut -d: -f3);do echo \\\$W,V=\\\$(shell command \\\$* \\\$W),T=\\\$(shell command $Y)\";echo\$(echo \$X|cut -d/ -f2)" $(shell command $Y)
또한 $(shell command)가 항상 동일한 쉘 명령인 경우 이를 최적화해야 할 수도 있습니다(예: 이전에 var를 생성하는 대신 shell 및 wrtie 명령을 삭제).
Y=[...];C='shell command';for X in $($C $Y);do echo ===\ $X\ on\ $Y\ ===;Z=$(echo $X|cut -d/ -f2);for W in $($C $Z|cut -d: -f3);do echo $W,V=$($C $Z $W),T=$($C $Y);done;echo;done
심지어:
Y=[...];C='shell command';E=echo;for X in $($C $Y);do $E ===\ $X\ on\ $Y\ ===;Z=$($E $X|cut -d/ -f2);for W in $($C $Z|cut -d: -f3);do $E $W,V=$($C $Z $W),T=$($C $Y);done;$E;done
특히 마지막은 굉장히 기술적으로 보이는데 라인으로 하는게 더 좋을 것 같아요 :-D
답변3
GNU 병렬을 사용하십시오 env_parallel
.
귀하의 코드는 정말 읽기 어렵고 다른 사람이 유지 관리하기 어렵습니다. 더 작은 기능으로 분할하여 원격 서버로 내보내면 더 쉬울 것입니다.
env_parallel --session
servers() {
/swb/local/scripts/swdList -p SMARTS -a A5SV_2017.1b -e 1 --type=instance --function=SAM --priority=1 |
grep -v sis
}
doit() {
# Run this on every server
}
env_parallel --nonall --slf <(servers) doit