我正在尝试从日志文件中打印一些日志以用于警报报告工具,我只需要过滤那些以**等特殊字符开头的日志。 请在此处找到日志文件中一些文本的示例。(图片)
到目前为止,我设法按如下所示在SOH字符之间打印日志,但是我无法找出如何仅打印以“ **”开头的那些记录,因此我想打印如下所示的记录“
日志文件内容:
SOH
+++ skdfhahjsahsdjk >
** ALPHA EDFJDJFKLJDKFJKSDLFJL
SDFSDGDRGRTG
WEFETTFYRT #168113++-
SOH
+++ skdfhahjsahsdjk >
* KJENRFKES DFJKLSDFJEDFJDJFKLJDKFJKSDLFJL
SDFSDGDRGRTG
WEFETTFYRT #168113++-
SOH
+++ skdfhahjsahsdjk >
CL mesukww juwaehdiearfa
SDFSDGDRGRTG
WEFETTFYRT #168113++-
SOH
+++ skdfhahjsahsdjk >
*C KJENRFKESDFJ ksludhieokdaewmdp
SDFSDGDRGRTG
WEFETTFYRT #168113++-
SOH
+++ skdfhahjsahsdjk >
** ALPHA EDFJDJFKLJDKFJKSDLFJL
SDFSDGDRGRTG
WEFETTFYRT #168113++-
到目前为止,我设法通过
在SOH字符之间打印了日志(在日志上方)cat OMlog5 | awk -F'[| ^ A ^ A]'> Test3
我也在下面的命令中尝试过,过滤以^ *开头的内容,但它只打印出以*开头的特定行,而不是整个日志
结果:
cat OMlog5|awk -F'[|^A^A]' '{print $0}'|grep "^*" >Test4 :
** KDHFGJHSDGDJLKSGJKFJJ
我希望是:
+++ skdfhahjsahsdjk >
** KJENRFKESDFJKLSDFJEDFJDJFKLJDKFJKSDLFJL
SDFSDGDRGRTG
WEFETTFYRT #168113++-
能帮您找到正确的命令吗?
我正尝试避免打印特定记录,例如与“ ALPHA”相关的日志。我尝试通过此代码,但未成功:
cat logfile |grep -v "ALPHA"> result_log
在此之后,它把我打印出来:
+++ skdfhahjsahsdjk >
SDFSDGDRGRTG
WEFETTFYRT #168113++-
我希望不打印与alpha有关的整个日志。 你能帮忙吗?
答案 0 :(得分:0)
此awk
命令将打印两行SOH
之间或最后SOH
行之后的所有内容,如果该块包含以**
开头的行(在可选空格之后) 。
编辑:根据新要求,脚本现在搜索带有两个星号(*
)而不是至少两个星号的行。
awk '/^[ ]*SOH[ ]*$/ { # match SOH line
if(found && length(buf)>0) print buf; # print old buffer
buf=""; # clear buffer
found=0; # no ** line yet
skip=1; # do not add SOH line to buffer
}
/^[ ]*\*\*[ ]/ { found=1;} # ** line found. Edit: The second [ ] (with space and tab) makes sure there are exactly two *
{ # for any line...
if(!skip) buf=buf $0 "\n"; # add line to buffer (except SOH)
skip=0; # do not skip next line
}
END { # to handle matching last record
if(found && length(buf)>0) print buf; # print old buffer
}' logfile
注意:方括号[ ]
之间有一个空格和一个制表符。 ([ ^I]
)
当我使用logfile
并将问题中显示的内容(在“日志文件内容:”下方)用作脚本的输入时,结果是
+++ skdfhahjsahsdjk >
** KJENRFKESDFJKLSDFJEDFJDJFKLJDKFJKSDLFJL
SDFSDGDRGRTG
WEFETTFYRT #168113++-
前导空格与问题“我希望是:”下面问题中显示的输出不同,因为问题中的日志文件内容具有更多前导空格。
答案 1 :(得分:0)
这可能更容易记住并且可以在日志格式关于行数一致的情况下起作用:
awk -F 'SOH' '{print $1}' log.txt | grep -B1 -A2 '^\*\*'
首先,它以SOH
分隔的组来作为其工作方式:
$ awk -F 'SOH' '{print $1}' log.txt
+++ skdfhahjsahsdjk >
** KJENRFKESDFJKLSDFJEDFJDJFKLJDKFJKSDLFJL
SDFSDGDRGRTG
WEFETTFYRT #168113++-
+++ skdfhahjsahsdjk >
* KJENRFKESDFJKLSDFJEDFJDJFKLJDKFJKSDLFJL
SDFSDGDRGRTG
WEFETTFYRT #168113++-
+++ skdfhahjsahsdjk >
CL KJENRFKESDFJKLSDFJEDFJDJFKLJDKFJKSDLFJL
SDFSDGDRGRTG
WEFETTFYRT #168113++-
+++ skdfhahjsahsdjk >
*C KJENRFKESDFJKLSDFJEDFJDJFKLJDKFJKSDLFJL
SDFSDGDRGRTG
WEFETTFYRT #168113++-
然后,您可以简单地使用grep
从模式-B1
中获取-A2
之前的一行,并在^\*\*
之后获取两行:
grep -B1 -A2 '^\*\*'
这将从您的示例返回:
+++ skdfhahjsahsdjk >
** KJENRFKESDFJKLSDFJEDFJDJFKLJDKFJKSDLFJL
SDFSDGDRGRTG
WEFETTFYRT #168113++-
如果您不关心第一个定界符SOH
,则可以这样做:
grep -B1 -A2 '^\*\*' log.txt
如果您的日志以多余的空格开头,则可以使用此正则表达式:
grep -B1 -A2 '^\s*\*\*' | grep -v -- --
额外的|grep -v -- --
是要删除--
分隔符
或者在Linux中,您可以使用--no-group-separator
:
grep -B1 -A2 '^\s*\*\*' --no-group-separator