「予期しない改行文字または文字列の終わり」について文句を言うsshコマンドラインのawkを修正する方法は?

「予期しない改行文字または文字列の終わり」について文句を言うsshコマンドラインのawkを修正する方法は?

次のスクリプトを実行すると問題があります。 ^予期しない改行または文字列の終わりが発生しました。どうすれば解決できますか?

[root@emrbldbgdapd2 ~]# ./collectdata.sh
collect the data of 10.209.61.124
awk: cmd. line:1: {print
awk: cmd. line:1:       ^ unexpected newline or end of string
collect the data of 10.209.61.125
awk: cmd. line:1: {print
awk: cmd. line:1:       ^ unexpected newline or end of string
[root@emrbldbgdapd2 ~]#
==========
[root@emrbldbgdapd2 ~]# more collectdata.sh
for i in `cat test`
do echo "collect the data of $i"
ssh -o LogLevel=error -o ConnectTimeout=5 $i 'hostname;
echo "############################";
free -g;
echo "######################################";
echo "######################################";
netstat -nr | grep [0-9] | tr [a-z] [A-Z];
echo "######################################";
echo "######################################";
mount|awk '{print $1,$3,$5}'|sort;
echo "######################################";
echo "######################################";
ip a s | grep -i eth*;
echo "######################################"'>output/$i-`date "+%d%b%Y"`
done
[root@emrbldbgdapd2 ~]#

ベストアンサー1

一重引用符で囲まれた文字列内に一重引用符を使用しようとしています。パイプと同じ行にある最初の内部一重引用符は、mount | awk | sortその行で始まる一重引用符を終了しますssh

実際のエラーはawk次のコマンドラインを取得します{print ,,}(呼び出しシェルによって$1$3$5の文字列に展開され、現在単一引用符が存在しません)。これは、というファイルで実行されるプログラムの構文awkエラー(欠落)として解釈されます。},,}

参照の問題を回避し、メンテナンスが簡単なプロセスを作成できるように、スクリプトを実際のスクリプトファイルに配置してリモートホストで実行することをお勧めします。

また、

  1. read結果を繰り返すwhile代わりにループで使用してください。forcat
  2. 特に、内部スクリプトの複数の場所に必要な参照が不足しています。たとえば、grep [0-9]ファイル名のグロービングをトリガーしないようにするために必要です。
  3. grep eth*不思議ですね。そんな意味でしたかgrep -e 'eth.'?現在のディレクトリで始まるすべての名前を選択するためのファイル名のグロービングパターンとして機能することに加えて、ethパターン(正規表現として解釈される場合)も一致し、etその後にゼロ個以上が続きますh
  4. バラより* shシェルではバックティック(「cmd」など)は使用されなくなりましたか?バックティックの使用について。

修正されたスクリプト:

#!/bin/sh

now=$( date +%d%b%Y )

if [ -d output ]; then
    echo 'Output directory missing' >&2
    exit 1
fi

while read host; do
    printf 'Collecting data from "%s"...\n' "$host"

    ssh -n -o LogLevel=error -o ConnectTimeout=5 "$host" \
      sh <<'END_SCRIPT' >output/"$host-$now"
        echo '## HOSTNAME:'
        hostname
        echo '## FREE:'
        free -g
        echo '## NETSTAT:'
        netstat -nr | grep '[0-9]' | tr 'a-z' 'A-Z'
        echo '## MOUNT:'
        mount | awk '{ print $1, $3, $5 }' | sort
        echo '## IP:'
        ip a s | grep -i 'eth.*'
END_SCRIPT
done <hosts.txt

おすすめ記事