用linux中的sed解析日志文件

时间:2017-02-01 13:25:31

标签: xml bash unix sed cygwin

我正在尝试使用sed解析日志文件,以使用模板从中提取xml消息。我想在新文件中获取所有xml消息。

我正在使用此命令sed 's/<sending>\(.*\)<\/sending>/\1/' input.out>output.xml

input.out有以下сontent:

 WARNING: Exchange[ExchangePattern: InOut, BodyType: byte[], Body: <?xml version="1.0" encoding="utf-8" standalone="yes"?><sending><query>        <describe>            <data>city</data>        </describe>    </query></sending>]
Sep 26, 2016 11:54:30 AM org.apache.camel.util.CamelLogger log
WARNING: Exchange[ExchangePattern: InOut, BodyType: byte[], Body: <?xml version="1.0" encoding="utf-8" standalone="yes"?><sending>    <query>        <key_info/>    </query></sending>]

我希望得到这样的结果:

 <query>        <describe>            <data>city</data>        </describe>    </query>    <query>        <key_info/>    </query>

但我只收到没有<sending></sending>元素的源文件:

WARNING: Exchange[ExchangePattern: InOut, BodyType: byte[], Body: <?xml version="1.0" encoding="utf-8" standalone="yes"?><query>        <describe>            <data>city</data>        </describe>    </query>]
Sep 26, 2016 11:54:30 AM org.apache.camel.util.CamelLogger log
WARNING: Exchange[ExchangePattern: InOut, BodyType: byte[], Body: <?xml version="1.0" encoding="utf-8" standalone="yes"?>    <query>        <key_info/>    </query>]

抱歉我的英语,祝你有愉快的一天。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

sed 's/.*<sending>\(.*\)<\/sending>.*/\1/' input.out>output.xml

你忘了删除行的周围部分(.*),sed只获取模式的内容,并且在发送之前或之后不包含char bloc

现在我建议

sed -e '/.*<sending>\(.*\)<\/sending>.*/!d' -e 's//\1/' input.out>output.xml

删除没有发送块的行。不要忘记,sed需要最长的partterne,所以如果同一行(或更多)上有2个集团,从第一次发送到最后/发送