reescreva uma string com texto e números em uma nova linha e insira texto

0

Em resumo, quero dividir a cadeia de saída de linha única em várias linhas e rotular cada matéria bruta com o nome do host.

Nome do host ProcessName CPUCore

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

Como inserir um loop por meio de um retorno que pareça.

rrcpd 17 rrcpd 0

e reescreva como

Hostname1 rrcpd 17
Hostname1 rrcpd 0

Nota

  • Os números podem variar de 0 a 32

  • Hostname é uma cadeia de variáveis $ myhost

  • O texto muda, o que significa que não é estritamente rrcpd, pode ser por exemplo,

    rrcpd 17 rrcpd 0

    Queijo 3 bolos 8

    Gatos 9 cachorros 3

Comando executado em cada host

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

A saída pode voltar com o processo 3-5 quando eu removo o grep, portanto, eu quero poder dividir cada saída e adicionar o nome do host ao raw para rotular cada saída. Estou verificando quais processos estão sendo executados em cada host.

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

Modifiquei o que é fornecido abaixo e consegui fazê-lo funcionar

#!/bin/bash
for remote in $(cat ssh_hosts2.txt)
do
    ssh -q -o StrictHostKeyChecking=yes "$remote" ps -eo comm,lastcpu |
    sed "s/^/$remote /"
done
    
por SaSa2929 13.08.2018 / 12:55

2 respostas

2

por favor tente isto,

Eu salvei a saída de amostra fornecida no arquivo /tmp/test.txt.

 xargs -n 2 | sed 's/^/Hostname1 /' 
  • -n significa o máximo de argumentos por linha.

Por exemplo:

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
    
por 13.08.2018 / 13:04
0

A única razão pela qual você veria o tipo de dados mostrado (mais de dois campos por linha na saída do comando ssh ) é quando você coleta a saída da sua chamada ssh + ps em uma variável e, em seguida, imprimi-lo sem citá-lo corretamente, como em output=$(ssh ...) seguido por echo $output em vez de echo "$output" . Felizmente, você não precisa coletar os dados em uma variável.

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

Aqui, awk está lendo diretamente do comando ssh e também faz o trabalho originalmente feito por grep em seu código. Ele assume que obterá linhas com dois campos e prefixará cada par de campos com o nome de host fornecido (lido em hosts.txt ).

Alternativamente,

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

Aqui, simplesmente prefixamos cada linha com o nome do host lido no arquivo de texto.

    
por 13.08.2018 / 13:48