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---

由罗素戴维斯在页面上撰写

但我不知道如何将其传输到单行语句以在管道中使用我的目标是tail -F将日志文件的一个管道传输到最终版本,以便它按分钟获得更新

4

3 回答 3

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

如果您的记录之间有要打印的文本,只需为未设置的“found”标志添加一个测试并调用打印当前记录的默认操作(!f;

awk '/<--|-->/{rec=""; f=1} f{rec = rec $0 ORS} !f; /Content-Length:/{ if (f && (rec !~ "REGISTER")) printf "%s",rec; f=0}' file
于 2012-12-02T15:05:28.150 回答
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删除它/它们,则正常打印它/它们。
于 2012-12-02T19:19:42.830 回答
1

如果我正确地得到了你需要的东西,你想过滤掉块,那就是只打印块:

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

如果你想删除它:

tail -f logfile | sed '/\(<--\|-->\)/,/Content-Length:/ d'
于 2012-12-02T14:18:24.823 回答