打印以特殊字符开头的整个日志

时间:2019-03-29 13:30:18

标签: linux

我正在尝试从日志文件中打印一些日志以用于警报报告工具,我只需要过滤那些以**等特殊字符开头的日志。 请在此处找到日志文件中一些文本的示例。(图片)

到目前为止,我设法按如下所示在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有关的整个日志。 你能帮忙吗?

2 个答案:

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