sed + encontrar valor antes da palavra na linha

1

Como posso encontrar o valor antes da palavra "free"?

top -n1 | grep Mem                   
Mem:  2054968k av, 2034120k used,   20848k free,       0k shrd,  186768k buff

Primeiro eu tentei

  top -n1 | grep Mem  | awk '{print $7}'

mas isso não é bom porque o valor gratuito (aqui, 20848k) pode estar em campos diferentes. Às vezes é campo 6, outros campo 7 e assim por diante.

Eu preciso disso para trabalhar no Linux e no Solaris.

    
por maihabunash 01.10.2014 / 17:48

3 respostas

2
awk -v RS="[, ]" '/free/{print a}{a=$0}'

Explicação

  • Defina o separador de registro como , e space , de modo que o número que precede cada string seja um registro em si, assim como a string.
  • Tendo tudo como seu próprio registro, o awk processará cada item um por um
  • Para todos os registros anteriores a free , ele ignorará o {print a} porque a condição não corresponde e ele pulará para {a=$0} , que armazenará o registro atualmente processado na variável a
  • Quando o /free/ for correspondido, o awk será apenas {print a} , em que a conterá o registro logo antes da correspondência
por 01.10.2014 / 17:55
3
$ top -bn1 | grep free
KiB Mem:   8117084 total,  6578888 used,  1538196 free,   302216 buffers
KiB Swap:  8060924 total,    26004 used,  8034920 free,  1564856 cached
$ top -bn1 | grep -oP '\S+(?=\s+free)'
1544132
8034920

requer o GNU grep, mas você marcou "linux", então está OK

Para apenas o "Mem":

top -bn1 | grep -oP 'Mem.*\s\K\S+(?=\s+free)'
    
por 01.10.2014 / 17:55
2

Usando o GNU sed (somente Linux):

top -bn1 | sed -rn '/Mem/{s/.* ([^ ]*) free.*//p;}'

Usando qualquer sed :

top -bn1 | sed -n '/Mem/{s/.* \([^ ]*\) free.*//p;}'

Usando perl :

top -bn1 | perl -lne '/Mem.* ([\d]+)\s*free/ && print $1'

Usando uma ferramenta projetada para o trabalho (testada no Linux, não tenho certeza se free está disponível no Solaris):

free | awk '/Mem/{print $4}'

Outra ferramenta projetada para o trabalho (deve funcionar no Linux e no Solaris):

vmstat 2 2 | tail -n 1 | awk '{print $4}'

Indo para a fonte (isso funciona no Linux, não tenho certeza sobre o Solaris):

awk '/MemFree/{print $2}' /proc/meminfo 
    
por 01.10.2014 / 18:02