我需要删除/过滤一个非常大的日志文件我设法将日志文件放入文本块中,从包含<--
或-->
的行开始,到包含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---
作者 Russell Davies 在此页面上
但是我不知道如何将其传输到单行语句以在管道中使用我的目标是将日志文件的tail -F
管道传输到最终版本,以便它按分钟更新
试试这个:
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
这可能对你有用(GNU sed);
sed '/<--|-->/!b;:a;/Content-Length/!{$!{N;ba}};//{/REGISTER/d}' file
-
/<--|-->/!b
如果行不包含<--
或-->
打印它 -
:a;/Content-Length/!{$!{N;ba}}
继续追加行,直到遇到字符串Content-Length
或文件末尾。 -
//{/REGISTER/d}
如果读入的行包含Content-Length
并REGISTER
删除它/他们否则正常打印它/它们。
正确得到您需要的内容,您想过滤掉该块,即仅打印该块:
tail -f logfile | sed -n '/(<--|-->)/,/Content-Length:/ p'
如果要删除它:
tail -f logfile | sed '/(<--|-->)/,/Content-Length:/ d'