从数据块中提取特定值

从数据块中提取特定值

我有以下数据块,需要提取 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

请注意,只要字符串FREEBYTESpercent="存在且后跟至少一个数字,然后是 ,所有这些都将适用于不同长度的任意输入"

答案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

percent使用XMLstarlet提取节点的属性值XYZ

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

相关内容