переписать строку с текстом и цифрами на новую строку и вставить текст

Короче говоря, я хочу разбить однострочную строку вывода на несколько строк и пометить каждую строку именем хоста.

Имя хоста ProcessName CPUCore

output = $ (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

Команды, которые запускаются на каждом хосте

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 

пожалуйста, попробуйте это,

Я сохранил данный пример вывода в файле /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 

Единственная причина, по которой вы видите тип отображаемых данных (более двух полей на строку в выходных данных команды 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  

Здесь awk читает непосредственно из команды ssh а также выполняет ту работу, которую изначально выполнял grep в вашем коде. Предполагается, что он получит строки с двумя полями и префикс каждой пары полей с заданным именем хоста (читается из hosts.txt ).

С другой стороны,

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

Здесь мы просто ставим перед каждой строкой имя хоста, прочитанное из текстового файла.