Suprimir / remover o retorno de carro da saída awk

0

Eu tenho um comando simples para retornar o uptime / load average de uma lista de servidores, e estou usando o awk para formatar a saída:

for i in $(cat servers); do ssh $i -qt "uptime" | awk -F\, -v host=\"$i\" '{ print host, $4, $5, $6 }'; done

Isso funciona razoavelmente bem:

"server1"   load average: 0.22  0.37  1.99
"server2"   load average: 0.22  0.37  1.99
"server3"   load average: 5.96  4.39  5.66

Infelizmente, o último campo deve conter um retorno de carro, o que significa que ele não pode aparecer em nenhum lugar, exceto no final do comando. Por exemplo:

for i in $(cat servers); do ssh $i -qt "uptime" | awk -F\, -v host=\"$i\" '{ print host, $6, $5, $4 }'; done

Saída:

0.64   load average: 0.17"  1.74
0.64   load average: 0.17"  1.74
0.78   load average: 0.15"  3.24

Como posso remover o retorno de carro de a) o final da entrada, ou b) o fim do campo $ 6?

    
por toryan 05.10.2018 / 16:23

2 respostas

3

Você deve remover a opção -t de ssh para evitar gerar o retorno de carro em primeiro lugar.

A opção -t direciona o ssh para alocar um pseudo-terminal na máquina remota , e se esse terminal tiver o sinalizador onlcr definido (que é o padrão), todo LF ( \n ) será traduzido para CR / LF ( \r\n ) na saída. A opção -t não é necessária, a menos que um programa interativo e / ou de tela inteira seja executado, como vi ou screen .

Mas se você realmente tiver que processar as linhas terminadas por CR / LF em awk , definir o separador de registro como CR / LF no início do script fará isso bem. Exemplo:

awk ... 'BEGIN{RS="\r\n"}{...}'

Além disso, se você quiser remover um CR perdido de um campo em awk , use sub ou gsub :

gsub("\r","",$6)
    
por 05.10.2018 / 18:52
0

Você pode remover o \r à direita com sed

ssh $i -qt "uptime" | sed 's/\r$//' | awk ...
# ....................^^^^^^^^^^^^^

Além disso, para práticas recomendadas, não leia as linhas de um arquivo com for

    
por 05.10.2018 / 16:54

Tags