2012-12-02 70 views
1

我需要刪除/過濾一個非常大的日誌文件 我設法將日誌文件放入以文本塊開始的文本塊,該行以包含<---->的行開頭, Content-Length: 現在如果該文本塊包含單詞REGISTER它需要被刪除。基於內容刪除兩行之間的文本塊

我發現流動的例子:

# sed script to delete a block if /regex/ matches inside it 
:t 
/start/,/end/ { # For each line between these block markers.. 
    /end/!{   # If we are not at the /end/ marker 
     $!{   #  nor the last line of the file, 
      N;  #  add the Next line to the pattern space 
      bt 
     }   # and branch (loop back) to the :t label. 
    }    # This line matches the /end/ marker. 
    /regex/d;  # If /regex/ matches, delete the block. 
}     # Otherwise, the block will be printed. 
#---end of script--- 

this

寫由羅素·戴維斯,但我不知道如何將這種傳輸到單個行語句在管道 我的目標是使用是將日誌文件的一個tail -F管道到最終版本,所以它得到由分鐘更新

+1

sed是一個很好的工具,可以簡單地替換一行代碼,但對於其他任何你應該使用awk的代碼來說,代碼將會更加清晰,並且在將來更容易增強。請張貼一些小樣本輸入和期望的輸出。 –

回答

3

試試這個:

awk '/<--|-->/{rec=""; f=1} f{rec = rec $0 ORS} /Content-Length:/{ if (f && (rec !~ "REGISTER")) printf "%s",rec; f=0}' file 

如果你想要的東西沒有做,提供更多的信息是什麼你想要的樣本輸入和輸出。

爲了打破上面的,下面是在單獨的行每條語句都加上一些註釋:

awk ' 
    /<--|-->/ {rec=""; f=1} # find the start of the record, reset the string to hold it and set a flag to indicate we've started processing a record 
    f {rec = rec $0 ORS} # append to the end of the string containing the current record 
    /Content-Length:/{  # find the end of the record 
     if (f && (rec !~ "REGISTER")) # print the record if it doesn't contain "REGISTER" 
     printf "%s",rec 
     f=0     # clear the "found record" indicator 
    } 
' file 

,如果你有你的記錄,你會想印之間的文本,只需添加一個用於測試的「發現「標誌沒有被設置和調用打印當前記錄(˚F!;)的默認操作

awk '/<--|-->/{rec=""; f=1} f{rec = rec $0 ORS} !f; /Content-Length:/{ if (f && (rec !~ "REGISTER")) printf "%s",rec; f=0}' file 
+1

謝謝!它完成了這項工作! –

+1

非常好,方便的提示。 – gath

1

如果我得到你需要的東西正確,你想過濾出的塊,這是唯一的原理t是塊:

tail -f logfile | sed -n '/\(<--\|-->\)/,/Content-Length:/ p' 

如果你想刪除它:

tail -f logfile | sed '/\(<--\|-->\)/,/Content-Length:/ d' 
+0

是正確的,但是如果塊中包含「註冊」,它必須被刪除或其他方式:只顯示如果在不包含「註冊」 –

+0

對不起,我錯過了是否刪除塊的決定。看到接受的其他解決方案是正確的。 –

2

這可能會爲你(GNU SED)的工作;

sed '/<--\|-->/!b;:a;/Content-Length/!{$!{N;ba}};//{/REGISTER/d}' file 
  • /<--\|-->/!b如果行不包含<---->打印它
  • :a;/Content-Length/!{$!{N;ba}}保持附加線,直到串Content-Length或文件的末尾遇到。
  • //{/REGISTER/d}如果讀入的行包含Content-LengthREGISTER刪除它/他們否則正常打印它/他們。
相關問題