簡體   English   中英

如何在日志中反轉grep匹配以及后跟的一些xml正文

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM