SSH를 통해 awk를 사용하여 여러 명령을 실행하는 방법은 무엇입니까?

SSH를 통해 awk를 사용하여 여러 명령을 실행하는 방법은 무엇입니까?

아래 명령을 실행하는 데 문제가 있습니다. awk 명령에 문제가 있습니다. 백슬래시를 추가해 보았지만 여전히 효과가 없습니다. 누구든지 내 구문에서 어디가 잘못되었는지 지적할 수 있습니까?

for i in $(cat db_hostlist2.txt | grep -v '^#'); do
  echo "Checking for $i";
  ssh admin@$i '
    . ./.bashrc; echo "Hostname : `hostname`";
    echo -e "Total DB is : `ps -ef | grep smon | grep -v grep | wc -l`\n";
    echo -e "Total DB is : \n`ps -ef | grep smon | grep -v grep |awk -F_ '{print $3}'`\n"
  ';
done

산출:

Hostname : TEST123
Total DB is : 3

awk: cmd. line:1: {print
awk: cmd. line:1:       ^ unexpected newline or end of string
Total DB is :

답변1

for HOST in $(grep -v '^#' db_hostlist2.txt)
do
        echo "Checking for $HOST"
        ssh admin@$HOST <<EOF
echo "Hostname : " \$(hostname)
echo -e "Total DB is : \$(ps -ef | grep smon | grep -v grep | wc -l)\n"
echo -e "Total DB is : \n\$(ps -ef | grep smon | grep -v grep |awk -F_ '{print \$3}')\n"
EOF
        echo "$HOST Complete"
done

두 EOF 사이의 모든 내용은 $(cmd)를 사용하여 원격 명령을 실행하지 않는 한 특수 문자를 이스케이프하지 않고 정상적으로 처리되고 원격으로 실행됩니다. 원한다면 거기에 지역 변수를 넣을 수 있습니다.

답변2

너무 복잡해 보입니다.

나의 충고:

for i in $(cat db_hostlist2.txt | grep -v '^#')
do 
     echo "Checking for $i"
     ssh admin@$i '. ./.bashrc;   
          echo "Hostname : "hostname ;
          echo -e "Total DB is : " ;
          ps -ef | grep -c [s]mon ;
          echo " DB are : " \
          ps -ef | grep [s]mon  |awk -F_ \'{print $3}\' ' 
 done

어디

  • 작은따옴표 안의 새 줄에 대해 걱정할 필요가 없습니다. (' 안에 개행 문자가 허용됩니다)
  • grep smon | grep -v grepgrep [s]mon자체적으로 grep되지 않는 것으로 대체됩니다 .
  • ps -ef | grep smon | grep -v grep | wc -lps -ef | grep -c [s]mon반환된 항목 수로 대체됩니다 .

  • echo -e "text명령은 \n"다음으로 대체됩니다 echo text ; a command(왜 -e를 사용하고 \n을 추가합니까? 대부분의 명령은 줄 바꿈도 생성합니다).

관련 정보