Extrai o valor específico do bloco de dados

1

Eu tenho o seguinte bloco de dados e preciso extrair o valor percentual em XYZ FREEBYTES, ou seja, o valor capturado deve ser igual a 64. Até onde eu sei, posso grep e cortar os dados. No entanto, os dígitos não são fixos. Como posso extrair o valor percentual da variável no bloco abaixo, por favor?

<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>
    
por alex 31.07.2015 / 15:18

3 respostas

1

Você pode usar o GNU grep :

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

Ou sed :

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

Ou GNU sed :

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

Ou awk :

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

Ou perl :

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

Observe que todos eles funcionarão com entradas arbitrárias de vários comprimentos, contanto que as seqüências de caracteres FREEBYTES e percent=" estejam presentes e sejam seguidas por pelo menos um número e, em seguida, " .

    
por 31.07.2015 / 16:40
0
 awk -F[=\"] '/<XYZ FREEBYTES/ {print $9}'

Isso localizará a linha com <XYZ FREEBYTES e imprimirá o 9º com delimitador = e " .

    
por 31.07.2015 / 15:59
0

qualquer campo pode ser selecionado em um arquivo XML, por exemplo, com xyz.xsl tendo

<?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>

apenas xsltproc xyz.xsl foo.xml renderia

<?xml version="1.0"?>




    64

Eu admito que isso é um pouco mais longo, e você tem que filtrar <?xml..> line, no entanto, o arquivo xml executado é mais fácil de processar.

    
por 31.07.2015 / 16:14

Tags