데이터 블록에서 특정 값 추출

데이터 블록에서 특정 값 추출

다음과 같은 데이터 덩어리가 있고 XYZ FREEBYTES에서 백분율 값을 추출해야 합니다. 즉, 캡처된 값은 64와 같아야 합니다. 내가 아는 한, 데이터를 grep하고 잘라낼 수 있습니다. 그러나 숫자는 고정되어 있지 않습니다. 아래 블록에서 변수의 백분율 값을 어떻게 추출할 수 있나요?

<ab type="global" id="80" totalid="80" intervalms="2150804.595">
    <contraction type="tenured" amount="4325376" newsize="1081330176" timetaken="6.373" reason="space following ab" />
    <finalization objectsqueued="2683" />
    <timesms mark="546.032" sweep="11.013" compact="0.000" total="564.779" />
    <XYZ FREEBYTES="700212376" totalbytes="108133017" percent="64" >
      <abc freebytes="696214000" totalbytes="107700531" percent="64" />
      <efg freebytes="3998376" totalbytes="432486" percent="92" />
    </XYZ>
  </ab>

답변1

GNU를 사용할 수 있습니다 grep.

grep -oP 'FREEBYTES.*percent="\K[0-9.]+' file

또는 sed:

sed -n '/FREEBYTES/{s/.*percent="\([0-9.]*\).*/\1/p}' file 

또는 GNU sed:

sed -rn '/FREEBYTES/{s/.*percent="([0-9.]+).*/\1/p}' file64

또는 awk:

awk '/FREEBYTES/{sub(/.*percent="/,""); sub(/".*/,""); print}' file

또는 perl:

perl -ne 'print if s/.*FREEBYTES.*percent="([0-9.]+).*/\1/' file

이 모든 것은 문자열 FREEBYTES및 가 존재하고 그 뒤에 최소한 하나의 숫자가 오는 한 percent="다양한 길이의 임의 입력에서 작동합니다 ".

답변2

 awk -F[=\"] '/<XYZ FREEBYTES/ {print $9}'

그러면 일치하는 줄을 찾고 <XYZ FREEBYTES구분 기호 와 =9번째 필드 가 인쇄됩니다 ".

답변3

모든 필드는 XML 파일에서 얻을 수 있습니다 xyz.xsl.

<?xml version="1.0"?>
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output type="text" />

<xsl:template match="//XYZ">
  <xsl:value-of select="@percent" />
</xsl:template>

</xsl:stylesheet>

xsltproc xyz.xsl foo.xml생산할 것이다

<?xml version="1.0"?>




    64

약간 길다는 점은 인정하고 일부 줄을 필터링해야 <?xml..>하지만 xml 파일이 즉시 작업하기 가장 쉽습니다.

답변4

percentXMLstarlet을 사용하여 노드의 속성 값을 추출합니다 XYZ.

xmlstarlet sel -t -v '//XYZ/@percent' file.xml

관련 정보