つまり、単一行の出力文字列を複数の行に分割し、各ソース文字列にホスト名をタグ付けしたいと思います。
ホスト名 プロセス名 CPUCore
出力=$(ssh -q -o "StrictHostKeyChecking yes" $ssh_host 'ps -eo comm,lastcpu | grep rrcp')
次のように出力を返してループを挿入するにはどうすればよいですか?
rrcpd 17 rrcpd 0
次のように書き直されました。
Hostname1 rrcpd 17
Hostname1 rrcpd 0
ノート
数字は0〜32です。
ホスト名は変数文字列$ myhostです。
テキストが変更されます。これは厳密に言うと、rrcpdではないという意味です。
rrcpd 17 rrcpd 0
チーズ3ケーキ8
猫9個3
各ホストで実行するコマンド
出力=$(ssh -q -o "StrictHostKeyChecking yes" $ssh_host 'ps -eo comm,lastcpu | grep rrcp')
grepを削除すると、3〜5個のプロセスを経て出力が再び出ることができるので、各出力を分割してソースファイルにホスト名を追加して、各出力にラベルを付けることができるようにしたいと思います。各ホストでどのプロセスが実行されているかを確認しています。
rrcpd 0 rrcp_mon.sh 24
RRCPD 0
RRCPD 0
rrcpd 0 rrcpd 1
rrcpd 0 rrcpd 0 rrcp_mon 24 rrcp_mon 24
RRCPD 0
RRCPD 0
rrcpd 17 rrcpd 0
ard 9 ssh 32 httpd 21 bax 22
下記の内容を修正して動作させました。
#!/bin/bash
for remote in $(cat ssh_hosts2.txt)
do
ssh -q -o StrictHostKeyChecking=yes "$remote" ps -eo comm,lastcpu |
sed "s/^/$remote /"
done
答え1
これを試してください、
与えられたサンプル出力を/tmp/test.txtファイルに保存しました。
xargs -n 2 | sed 's/^/Hostname1 /'
-n
行あたりの最大パラメータを示します。
例えば。
cat /tmp/test.txt | xargs -n 2 | sed 's/^/Hostname1 /g'
Hostname1 rrcpd 17
Hostname1 rrcpd 0
Hostname1 Cheese 3
Hostname1 cakes 8
Hostname1 Cats 9
Hostname1 dogs 3
答え2
表示されたデータ型(コマンド出力の1行に2つ以上のフィールド)が表示される唯一の理由は、ssh
+呼び出しの出力を変数として収集し、それを正しく参照せずに出力することです。幸いなことに、変数のデータをまったく収集する必要はありません。ssh
ps
output=$(ssh ...)
echo $output
echo "$output"
while read remote; do
ssh -n -q -o StrictHostKeyChecking=yes "$remote" ps -eo comm,lastcpu |
awk -v host="$remote" '/rrcp/ { print host, $1, $2 }'
done <hosts.txt
ここでは、コマンドから直接読み込み、元のawk
コードでssh
行われた操作も実行します。 2つのフィールドを含む行を取得し、各フィールドペアの前にgrep
指定されたホスト名(から読み取る)を付けたとします。hosts.txt
または、
while read remote; do
ssh -n -q -o StrictHostKeyChecking=yes "$remote" ps -eo comm,lastcpu |
sed "s/^/$remote /"
done <hosts.txt
ここでは、テキストファイルから読み取ったホスト名を各行の前に付けるだけです。