2016-09-07 67 views
0

嗨我有一個大的日誌文件,我試圖讓xml數據傳遞給它。sed多行刪除之前模式

我有ressembles這是一個很大的日誌文件:

2016/01/01 bladh bqskjdqskldjqsdlqskdjqlskdj dazihzmkldjkdjqslkjd 
2016/01/01: qsdhqsdlkqsmdjqsldjqslkdjqlskdjqslkdjqslkdjqskdjqsd 
2016/01/01: qsjdqmlskdmlqskdmcxxxx [qskjd][qsdjqslkdj] Payload :[<LOG><a>a</a> 
<b>b</b> 
<c>c</c> 
<id>XXXXX</id> 
<d>d</d> 
</LOG>]] 

2016/01/01 bladh bqskjdqskldjqsdlqskdjqlskdj dazihzmkldjkdjqslkjd 
2016/01/01: qsdhqsdlkqsmdjqsldjqslkdjqlskdjqslkdjqslkdjqskdjqsd 
2016/01/01: qsjdqmlskdmlqskdmcxxxx [qskjd][qsdjqslkdj] Payload :[<LOG> <a>a</a> 
<b>b</b> 
<c>c</c> 
<id>YYYYY</id> 
<d>d</d> 
</LOG>]] 
qskdmqlskdqlsdqlskdqlsdk 
qsdlkqsdlkqsdmlkqsdlk 

現在我使用

sed -n '/<START/{:start /\/END/!{N;b start};/XXXXX/p}' logFile 

和我得到這個

2016/01/01: qsjdqmlskdmlqskdmcxxxx [qskjd][qsdjqslkdj] Payload :[<LOG><a>a</a> 
<b>b</b> 
<c>c</c> 
<id>XXXXX</id> 
<d>d</d> 
</LOG>]] 

我想找回整個XML並得到:

<LOG>  
    <a>a</a> 
    <b>b</b> 
    <c>c</c> 
    <id>XXXX</id> 
    <d>d</d> 
</LOG> 

在此先感謝

+0

嘗試'grep -oPz'(?s)。*?'logFile | tr'\ 0''\ n''檢索所有' ...' – Sundeep

+0

'sed'/^ Beta

+0

我想我的grep已經過時了? grep:-P和-z選項不能合併 – testeurFou

回答

0

試試這個:

sed -n '/<LOG/{:a;/<\/LOG/!{N;ba};s/.*\(<LOG>\)\(.*XXXXX.*<\/LOG>\).*/\1\n\2/p}' logFile 

它應該做的工作,但要記住,sed的不是解析XML的工具。當你必須解析有效的xml文件時,你應該考慮使用xmlstarletxmllint

+0

嗨,非常感謝,這似乎工作,但你能請解釋..我不想只是複製和粘貼。 另外,如何過濾我的XXXX唯一的請求。 – testeurFou

+0

我更新了我的答案。 – SLePort

1

解決方案在TXR

@(repeat) 
@ (skip)Payload :[<@tag>@preamble 
@ (collect) 
@middle 
@ (last) 
</@tag>]] 
@ (end) 
@ (output) 
<@tag> 
    @(trim-str preamble) 
@ (repeat) 
    @middle 
@ (end) 
</@tag> 
@ (end) 
@(end) 

運行:

$ txr extract.txr data 
<LOG> 
    <a>a</a> 
    <b>b</b> 
    <c>c</c> 
    <id>XXXXX</id> 
    <d>d</d> 
</LOG> 
<LOG> 
    <a>a</a> 
    <b>b</b> 
    <c>c</c> 
    <id>YYYYY</id> 
    <d>d</d> 
</LOG> 
0

這可能爲你工作(GNU SED):

sed -nr '/<LOG>/,/<\/LOG>/{s/.*(<LOG>)\s*/\1\n/;s/(<\/LOG>).*/\1/;p}' file 

使用SEDS類似grep的選項來抑制印刷除非明確要求並利用範圍特徵/.../,/.../,頂部和尾部產生的字符串。

相關問題