在 linux 中使用 sed 解析日志文件

Parsing log file with sed in linux

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

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

input.out 有以下内容:

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

抱歉我的英语不好,祝你有美好的一天。谢谢你的帮助。

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

您忘记 删除 行周围的部分 (.*),sed 只获取您的模式的内容,您不在前后包含字符你的发送集团

现在我建议

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

它删除没有发送方块的行。不要忘记 sed 占用最长的 partterne,所以如果在同一行(或更多)上有 2 个 bloc,它从第一次发送到最后一次 /sending