2010-11-12 94 views
0

events<xyz>.log的内容:使用grep解析日志的unix shell脚本

<log> 
<time>09:00:30</time> 
<entry1>abcd</entry1> 
<entry2>abcd</entry2> 
<id>john</id> 
</log> 
<log> 
<time>09:00:35</time> 
<entry1>abcd</entry1> 
<entry2>abcd</entry2> 
<id>steve</id> 
</log> 
<log> 
<time>09:00:40</time> 
<entry1>abcd</entry1> 
<entry2>abcd</entry2> 
<id>john</id> 
</log> 

我想用<id>'john'将所有<log>条目的entry1和entry2标签提取到一个文件中。我想在shell脚本中执行此操作,该脚本将查看目录中的所有* .log文件。输出应类似于以下内容。

a.out的内容:

<time>09:00:30</time> 
<entry1>abcd</entry1> 
<entry2>abcd</entry2> 

<time>09:00:40</time> 
<entry1>abcd</entry1> 
<entry2>abcd</entry2> 

我是shell脚本的新手,但是我尝试了一些基本的命令,至少要查看日志:

$ grep -B 3 -in '<id>john</id>' * > /tmp/a.out 

上面的命令给了我john的id标签以上3行输出如下

... 
events111.log-100- <time>09:00:40</time> 
events111.log-101- <entry1>abcd</entry1> 
events111.log-102- <entry2>abcd</entry2> 
events111.log-103- <id>john</id> 
.... 
events112.log-200- <time>06:56:03</time> 
events112.log-201- <entry1>abcd</entry1> 
events112.log-202- <entry2>abcd</entry2> 
events112.log-203- <id>john</id> 

这很好,但问题是-3行每次都不能工作,中间可能会有更多的标签,所以需要一些解析逻辑找出从<time></id>的文本。

我非常感谢为此制定脚本的一些帮助。

谢谢!

回答

2

你有没有考虑过使用xml这样的grey工具,比如xml starlet从这些日志文件中挑选出来的部分?它会更清洁。

+0

哇! xml starlet是一个伟大的工具!我正在尝试使用xml sel <全球选项> {