데이터 블록에서 값 추출

데이터 블록에서 값 추출

다음과 같은 데이터 덩어리가 있습니다.

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

    일치하는 줄을 위해 다섯 번째와 일곱 번째 필드를 인쇄합니다. 이 값에 0을 추가함으로써 awk가 이를 숫자로 변환하도록 강제합니다. 이것은 제거되어야 합니다 k.

관련 정보