BashスクリプトでAWKing SSHコマンドを使用すると誤った出力が生成される

BashスクリプトでAWKing SSHコマンドを使用すると誤った出力が生成される

Javaサーバーからいくつかのデータを取得する単純なbashスクリプトから情報を抽出しようとしています。 SSH変数がスクリプトで実行されたときにawkローカルファイルに書き込まないと、必要な情報を抽出するために実行できないようです。私がしている作業は次のとおりです。

check=$(ssh [email protected] "/usr/local/bin/check_mq.sh")
ret=$?
cat=/bin/cat
awk=/usr/bin/awk
output=$($cat $check | $awk -F= '{print $4}' | $awk '{print $1}')
echo $output

echo $check私のスクリプトでこれが起こった場合。

backchannel_queue messages=0 messages_ready=0 messages_unacknowledged=0 

$checkただし、コマンドをスクリプトに入れると、awk次のような出力が得られます。

/bin/cat: backchannel_queue: No such file or directory
/bin/cat: 'messages=0': No such file or directory
/bin/cat: 'messages_ready=0': No such file or directory
/bin/cat: 'messages_unacknowledged=0': No such file or directory

$output私のシステムのテキストファイルに書き込んでこれを行うことができました。

 check_output="/home/user/Documents/scratch/check_output.txt"
 echo $check > $check_output
 output=$($cat $check_output | $awk -F= '{print $4}' | $awk '{print $1}')
 echo $output

$outputここで何か間違っているようです。ファイルに書き込む必要はありません。それともこれが唯一の選択ですか?この数字を変数に入れたら、いくつかのIFステートメントを使用してこの数字がそれより大きいかどうかを確認しますx

答え1

ファイルのリストを知らせると、catそのリストは実際にはファイルではなく作業したいものです。これを行うecho代わりに使用したいと思いますcat

答え2

使用しているコマンドのパスを変数に保存しないでください。まったく必要ありません。非標準パス(使用されていないパス)でツールを使用している場合は、そのパスを変更してください$PATH

あなたはを使用していますcat $check。これに注目すべき2つのことがあります。

  1. $checkスペースはフィールド分割され、複数の単語に変換されます。ファイル名にワイルドカード文字が含まれている場合は、ファイル名のグロービングになります。

  2. cat結果の単語は、ファイル名として期待されるに提供されます。ここでエラーが発生します。

ssh代わりに、次に直接パイプしてくださいawk

ssh [email protected] "/usr/local/bin/check_mq.sh" |
awk -F '=' '{ print $NF }'

=これは、行の最後の数字の後に数字を出力すると仮定します。

数値が一部の変数より大きいかどうかをテストするには、次のようにします$x

ssh [email protected] "/usr/local/bin/check_mq.sh" |
awk -F '=' -v x="$x" '$NF > x { printf("%d is more than %d\n", $NF, x) }'

答え3

変数なので、echo代わりに使用してください。次のように使用cat$check

check=$(ssh [email protected] "/usr/local/bin/check_mq.sh")
ret=$?
cat=/bin/cat
awk=/usr/bin/awk
output=$(echo $check | $awk -F= '{print $4}' | $awk '{print $1}')
echo $output

関連情報