#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
PS:返信を送ってくれた皆さんに心から感謝します。残念ながら、減らしてあまり複雑ではないように努めましたが、それが私が書いたものです。
答え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)
また、$(シェルコマンド)が常に同じシェルコマンドである場合は、これを最適化する必要があります(たとえば、以前に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