[英]How do I invert grep matches followed by some xml body in logs
我想從日志文件中grep出(反轉grep /反轉grep)一些xml數據。 grep -v可以工作,但是我有一些巨型的xml正文每隔5分鍾在我的日志中打印一次,我想將整個xml正文grep出來,因為它主要是噪音,使我更難以解析日志文件。 我想grep的行看起來像這樣。
date time pattern
<xml-tag>
<smaller tag1>
<smaller tag2>
</smaller tag1>
</smaller tag2>
</xml-tag>
當我嘗試類似的東西
grep -v "pattern" log-file
模式被竊取。 但是xml被遺忘了。 無論如何要grep出所有從到結尾的所有內容? 我也試過
egrep -v -A6 "pattern" log-file
作為最后的努力。 我認為這應該在比賽結束后grep 6行。 由於某種原因,這也不起作用。
要跳過pattern和xml結束標記之間的所有行:
awk '/pattern/,/<\/xml-tag>/ {next} 1' logfile
以此作為日志文件:
$ cat logfile
before1
date time pattern
<xml-tag>
<smaller tag1>
<smaller tag2>
</smaller tag1>
</smaller tag2>
</xml-tag>
after1
產生的輸出是:
$ awk '/pattern/,/<\/xml-tag>/ {next} 1' logfile
before1
after1
在awk
,表達式/pattern/,/<\\/xml-tag>/
定義了一系列行,這些行以其中包含pattern
的行開始,並以其中包含<\\/xml-tag>
的下一行結束。 對於任何這樣的行,都會執行next
命令,這意味着該行不會被打印,而awk
開始處理下一行。 如果未執行next
,換句話說,我們不在不需要的塊中,則執行1
,在awk
,它是“打印此行”的縮寫。
這是一個不使用range函數的awk
:
awk '/pattern/ {f=1} !f; /<\/xml-tag>/ {f=0}' file
before1
after1
范圍功能很好,但是如果要進行其他測試,則靈活性較差。
這可能對您有用(GNU sed):
sed '/pattern/,/<\/xml-tag>/d' logfile
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.