テキストと数字を含む文字列を改行で書き換えてテキストを挿入する

テキストと数字を含む文字列を改行で書き換えてテキストを挿入する

つまり、単一行の出力文字列を複数の行に分割し、各ソース文字列にホスト名をタグ付けしたいと思います。

ホスト名 プロセス名 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+呼び出しの出力を変数として収集し、それを正しく参照せずに出力することです。幸いなことに、変数のデータをまったく収集する必要はありません。sshpsoutput=$(ssh ...)echo $outputecho "$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

ここでは、テキストファイルから読み取ったホスト名を各行の前に付けるだけです。

関連情報