como fazer o awk imprimir 3 itens na mesma linha e depois mudar para uma nova linha

1

Estou tentando analisar a saída dos meus principais resultados para selecionar o timestamp, usei o Mem e usei o Swap:

top - 12:06:52 up  3:36, 37 users,  load average: 0.00, 0.02, 0.00
Tasks: 563 total,   1 running, 562 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.3%us,  0.1%sy,  0.0%ni, 99.6%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  65968400k total,  9594508k used, 56373892k free,   199136k buffers
Swap: 68026360k total,        0k used, 68026360k free,  5864056k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                    
11527 root      15   0 26464 1728 1056 R  1.9  0.0   0:00.01 top                                                        

Então, isso é uma amostra disso. Agora eu peguei o awk cmd abaixo:

awk '$1 ~/top/ {print $5;} $1 ~/Mem/ {print $4;} $1 ~/Swap/  {print $4;}' top-output

Mas não é perfeito porque gera tudo em uma nova linha. Assim:

7:40,
12644016k
0k
7:50,
12411248k
0k 
8:04,
12795392k
0k

Eu quero que a saída seja assim:

7:40, 12644016k, 0k
7:50, 12411248k, 0k

Como faço isso? Obrigado

    
por D.Zou 07.08.2015 / 21:23

1 resposta

1

Um método é usar printf :

$ awk '$1 ~/top/ {printf "%s ",$5;} $1 ~/Mem/ {printf "%s ",$4;} $1 ~/Swap/  {print $4;}' top-output
3:36, 9594508k 0k

printf oferece formatação flexível e, a menos que você explique explicitamente, imprime um caractere de nova linha. O primeiro argumento para printf é a string de formato para printf . A string de formato está documentada em man awk .

Outro método para salvar os valores e usar print apenas uma vez:

$ awk '$1 ~/top/ {up=$5;} $1 ~/Mem/ {used=$4;} $1 ~/Swap/  {print up,used,$4;}' top-output
3:36, 9594508k 0k

Adicionando a vírgula extra

$ awk '$1 ~/top/ {printf "%s ",$5;} $1 ~/Mem/ {printf "%s, ",$4;} $1 ~/Swap/  {print $4;}' top-output
3:36, 9594508k, 0k

$ awk '$1 ~/top/ {up=$5;} $1 ~/Mem/ {used=$4;} $1 ~/Swap/  {print up,used",",$4;}' top-output
3:36, 9594508k, 0k

Removendo o k

Com printf, podemos especificar um formato inteiro e isso força a conversão para um número que remove o k :

$ awk '$1 ~/top/ {printf "%s ",$5;} $1 ~/Mem/ {printf "%i, ",$4;} $1 ~/Swap/  {print $4;}' top-output
3:36, 9594508, 0k

Outra maneira de forçar uma conversão para um número é adicionar zero a ele. Assim, o seguinte usa used=$4+0 no lugar de used=$4 :

$ awk '$1 ~/top/ {up=$5;} $1 ~/Mem/ {used=$4+0;} $1 ~/Swap/  {print up,used",",$4;}' top-output
3:36, 9594508, 0k

Remover a vírgula do tempo de atividade

O tempo de atividade tem dois pontos entre dois números e o awk não pode convertê-lo em um número. Isso significa que outras abordagens são necessárias. Uma maneira de fazer a vírgula desaparecer da saída é adicionar uma vírgula ao separador de campo:

$ awk -F'[,[:space:]]+' '$1 ~/top/ {printf "%s ",$5;} $1 ~/Mem/ {printf "%s ",$4;} $1 ~/Swap/  {print $4;}' top-output
3:36 9594508k 0k

$ awk -F'[,[:space:]]+' '$1 ~/top/ {up=$5;} $1 ~/Mem/ {used=$4+0;} $1 ~/Swap/  {print up,used,$4;}' top-output
3:36 9594508 0k
    
por 07.08.2015 / 21:40

Tags