다음 스크립트를 한 줄로 어떻게 작성할 수 있습니까?

다음 스크립트를 한 줄로 어떻게 작성할 수 있습니까?
#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

관련 정보