2010-11-12 98 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 <全球選項> {