使用Sed或Grep或Awk或print来获取特定数据

时间:2014-07-06 09:16:04

标签: bash printing awk sed grep

我遇到了从日志中获取正确的解析格式的问题。

这里是样本:

<user type="A" name="user1" prod="" trunk="data1(none)" trunk_data="tr1" IE="0" thid="id_0x1c682a0">

我需要获得此输出:

user1 data1(none)

获得我需要的数据格式的最佳方法是什么?每次我需要的数据都在&#34;报价&#34;

谢谢

伊万

3 个答案:

答案 0 :(得分:2)

对于完整的XML处理,您应该使用XSL Transformationsxsltproc。 XSL文件(比如user.xsl)将是:

<stylesheet xmlns='http://www.w3.org/1999/XSL/Transform' version='1.0'>
  <output method='text'/>
  <template match='/'>
    <apply-templates select='//user'/>
  </template>
  <template match='user'>
    <value-of select='@name'/>
    <text> </text>
    <value-of select='@trunk'/>
    <text>&#10;</text>
  </template>
</stylesheet>

然后您将使用:

xsltproc user.xsl my.log

答案 1 :(得分:0)

通过sed,

$ sed 's/.*name=\"\([^"]*\).*trunk=\"\([^"]*\).*/\1 \2/g' file
user1 data1(none)

通过grep,

$ grep -oP '(?<=name=\")[^"]*|(?<=trunk=\")[^"]*' file | paste -d' ' - -
user1 data1(none)

以上命令将获取名称和主干字段的值。

答案 2 :(得分:0)

这应该做:

awk -F\" '{print $4,$8}' file
user1 data1(none)

如果数据字段数确实有变化并且位置确实有所不同,您可以使用此gnu awk(由于RS而导致的gnu)

awk -v RS="[a-z]*=" -F\" '{$1=$1} a~/^(name|trunk)/{print a $2}{a=RT}' file
name=user1
trunk=data1(none)