Extrai valores do bloco de dados

2

Eu tenho o bloco de dados abaixo.

Heap after GC invocations=31 (full 3):  
 par new generation   total 131008K, used 0K [0x00000000eac00000, 0x00000000f2c00000, 0x00000000f2c00000)  
  eden space 130944K,   0% used [0x00000000eac00000, 0x00000000eac00000,   0x00000000f2be0000)
  from space 64K,   0% used [0x00000000f2be0000, 0x00000000f2be0000, 0x00000000f2bf0000)  
  to   space 64K,   0% used [0x00000000f2bf0000, 0x00000000f2bf0000, 0x00000000f2c00000)  
 concurrent mark-sweep generation total 131072K, used 48549K [0x00000000f2c00000, 0x00000000fac00000, 0x00000000fac00000)  
 concurrent-mark-sweep perm gen total 30000K, used 19518K [0x00000000fac00000, 0x00000000fc94c000, 0x0000000100000000)  
}

Eu preciso extrair os dados abaixo de dados numéricos "total" e "usados" sem "K" para o abaixo. ou seja, value1=131008, value2=0,value3=131072,value4=48549,value5=30000 and value6=19518

deve ser extraído do abaixo:

par new generation   ***total*** 131008K, ***used*** 0K
concurrent mark-sweep generation ***total*** 131072K, used 48549K 
concurrent-mark-sweep perm gen ***total*** 30000K, ***used*** 19518K

Eu sei extrair os dados para valores de comprimento fixo, como abaixo.

value1='grep "par new generation" | cut -c27-31

No entanto, o bloco de dados acima possui valores de tamanho variável.

    
por alex 26.06.2015 / 00:17

1 resposta

2

Se o seu objetivo é extrair esses seis números em variáveis shell, provavelmente é mais conveniente colocá-los em uma matriz bash como esta:

$ data=($(awk '/^ *(par|concurrent)/{printf "%s %s ",$5+0,$7+0}' file))

Você pode verificar se a matriz possui os valores corretos usando declare :

$ declare -p data
declare -a data='([0]="131008" [1]="0" [2]="131072" [3]="48549" [4]="30000" [5]="19518")'

Se, em vez disso, você quiser apenas imprimir os valores:

$ awk '/^ *(par|concurrent)/{printf "value%s=%s\nvalue%s=%s\n",++c,$5+0,++c,$7+0}' file
value1=131008
value2=0
value3=131072
value4=48549
value5=30000
value6=19518

Como funciona

  • /^ *(par|concurrent)/

    Isso corresponde apenas às linhas que começam com par ou concurrent .

  • printf "%s %s ",$5+0,$7+0

    Para as linhas combinadas, imprimimos o quinto e o sétimo campos. Adicionando zero a esses valores, forçamos o awk a convertê-los em números. Isso tem o efeito colateral de remover o k .

por 26.06.2015 / 00:28

Tags