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


0

要するに、1行の出力文字列を複数の行に分割し、各rawにホスト名のラベルを付けます。

ホスト名ProcessName CPUCore

output = $(ssh -q -o "StrictHostKeyChecking yes" $ ssh_host 'ps -eo comm、lastcpu | grep rrcp')

次のようなreturn out putにループを挿入する方法。

rrcpd 17 rrcpd 0

そして、

Hostname1 rrcpd 17
Hostname1 rrcpd 0

注意

  • 数字は0〜32

  • ホスト名は変数文字列$ myhostです

  • テキストは変更されます。つまり、厳密にはrrcpdではなく、たとえば

    rrcpd 17 rrcpd 0

    チーズ3ケーキ8

    猫9犬3

各ホストで実行されるコマンド

output = $(ssh -q -o "StrictHostKeyChecking yes" $ ssh_host 'ps -eo comm、lastcpu | grep rrcp')

grepを削除すると、出力は3〜5プロセスで戻る可能性があるため、各出力を分割し、ホスト名をrawに追加して各出力にラベルを付けることができます。各ホストで実行されているプロセスを確認しています。

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

わかりません。適切な例と結果を追加してください。与えられた例では、答えは有効です。意味を推測する必要がないように、テキストを適切にフォーマットしてください。
pLumo

grep forを実行すると、最後の行が出力されるのはなぜrrcpですか?
クサラナナンダ

回答:


2

これを試してください、

特定のサンプル出力をファイル/tmp/test.txtに保存しました。

 xargs -n 2 | sed 's/^/Hostname1 /' 
  • -n は、1行あたりの最大引数を意味します。

例えば;

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

^行ごとに一致するのは1 つだけ/gなので、使用する必要はありません。
クサラナナンダ

0

表示するデータのタイプ(sshコマンドの出力で1行に3つ以上のフィールド)が表示される唯一の理由は、ssh+ ps呼び出しの出力を変数に収集し、適切に引用せずに出力する場合です。の代わりにがoutput=$(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コマンドから直接読み取りをgrep行い、コードで元々行われた作業も行います。2つのフィールドを持つ行を取得し、フィールドの各ペアに指定されたホスト名(から読み取られるhosts.txt)をプレフィックスすることを想定しています。

あるいは、

while read remote; do
    ssh -n -q -o StrictHostKeyChecking=yes "$remote" ps -eo comm,lastcpu |
    sed "s/^/$remote /"
done <hosts.txt

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


通常はプロセス名の後にコアである数字が続く文字列と数字の単一行の出力を読みたいです。場合によっては単一のテキストと数字であり、場合によってはテキストの後に数字が続く2、3または4プロセスを返します。私の目的は、このコマンド出力ps -eo comm、lastcpuを取得し、各テキスト番号、テキスト番号........を複数の行に分割し、各行にホスト名とそれに続くテキスト番号のラベルを付けることです。
-SaSa2929

@ SaSa2929私が投稿したコードを実際にテストしましたか?psユーティリティは今まで出力2列になります。より多くの列の行で作業していることに気付く唯一の理由はecho、引用符で囲まれていない変数だからです。
クサラナナンダ

ありがとう、それはほとんど、試してみました、それは最初のホストのみを読み取ります、どうすれば次のホストにループさせることができますか?
SaSa2929

@ SaSa2929ああ、忘れてsshしまいましたが、入力ファイルのデータを食べてしまいます。を使用しssh -nます。答えを更新します...
クサラナンダ

forループを使用するように変更しましたが、今は動作し、すべてのプロセスを返します。さらに一歩進んで、興味のあるプロセスのリストを提供し、他のすべてのプロセスを無視する方法はありますか?ある種の配列内のプロセスを特定したり、リストを含めることができますが、他のすべては除外されます。#!/ bin / bash in $(cat ssh_hosts2.txt)do ssh -q -o StrictHostKeyChecking = yes "$ remote" ps -eo comm、lastcpu | sed "s / ^ / $ remote /" done
SaSa2929
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.