我在执行下面的命令时遇到困难。 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]mon
which 本身不会 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 ?大多数命令也会产生换行符)。