次のデータの塊があります。
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)
}
「K」を持たない「Total」および「Used」数値データに対して、次のデータを抽出する必要があります。つまりvalue1=131008, value2=0,value3=131072,value4=48549,value5=30000 and value6=19518
以下から抜粋する必要があります。
par new generation ***total*** 131008K, ***used*** 0K
concurrent mark-sweep generation ***total*** 131072K, used 48549K
concurrent-mark-sweep perm gen ***total*** 30000K, ***used*** 19518K
以下のように、固定長値のデータを抽出する方法を知っています。
value1=`grep "par new generation" | cut -c27-31
ただし、上記のデータブロックには可変長値があります。
ベストアンサー1
目標がこの6つの数字をシェル変数として抽出することであれば、次のようにbash配列に配置する方が便利です。
$ data=($(awk '/^ *(par|concurrent)/{printf "%s %s ",$5+0,$7+0}' file))
以下を使用して、配列に正しい値があることを確認できますdeclare
。
$ declare -p data
declare -a data='([0]="131008" [1]="0" [2]="131072" [3]="48549" [4]="30000" [5]="19518")'
代わりに値のみを印刷したい場合:
$ 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
効果はどうですか?
/^ *(par|concurrent)/
par
これは、またはで始まる行にのみ一致しますconcurrent
。printf "%s %s ",$5+0,$7+0
一致する行のために5番目と7番目のフィールドを印刷します。この値にゼロを追加することで、awkがそれを数値に変換するように強制します。これは削除する必要があります
k
。