
以下のコマンドの実行に問題があります。 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
2つの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
それ自体は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を追加するのですか?ほとんどのコマンドは改行も生成します)。