データブロックから特定の値を抽出する

データブロックから特定の値を抽出する

次のデータ塊があり、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とが存在し、その後に少なくとも1つの数字が来る限り、さまざまな長さの任意の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

関連情報