如何通过 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 grep被替换为grep [s]monwhich 本身不会 grep 。
  • ps -ef | grep smon | grep -v grep | wc -l替换为ps -ef | grep -c [s]mon返回的项目数。

  • echo -e "text命令\n"被替换为echo text ; a command(为什么使用 -e 并添加 \n ?大多数命令也会产生换行符)。

相关内容