Linux 如何避免在日志文件中打印特殊记录

Linux 如何避免在日志文件中打印特殊记录,linux,shell,scripting,Linux,Shell,Scripting,我试图从日志文件中打印一些日志,避免打印特定的日志 我有一个日志文件,如下所示: SOH +++ skdfhahjsahsdjk > ** ALPHA EDFJDJFKLJDKFJKSDLFJL SDFSDGDRGRTG WEFETTFYRT #168113++- SOH +++ skdfhahjsahsdjk > * KJENRFKES DFJKLSDFJEDFJDJFKLJDKFJKSDLFJL

我试图从日志文件中打印一些日志,避免打印特定的日志

我有一个日志文件,如下所示:

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 >
    ** BETA EDFJDJFKLJDKFJKSDLFJL
       SDFSDGDRGRTG
       WEFETTFYRT #168113++-
   SOH
    ** Gama EDFJDJFKLJDKFJKSDLFJL
       SDFSDGDRGRTG
       WEFETTFYRT #168113++-  
我可以用下面的脚本打印特殊字符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
我试图避免打印特定于e的记录,例如与“ALPHA”相关的日志

我尝试通过以下代码进行操作,但未成功:

cat logfile |grep -v "ALPHA"> result_log
结果:

SOH 
 +++ skdfhahjsahsdjk >

   SDFSDGDRGRTG
   WEFETTFYRT #168113++-

SOH
 +++ skdfhahjsahsdjk >
** BETA EDFJDJFKLJDKFJKSDLFJL
   SDFSDGDRGRTG
   WEFETTFYRT #168113++-
SOH
** Gama EDFJDJFKLJDKFJKSDLFJL
   SDFSDGDRGRTG
   WEFETTFYRT #168113++-
正如您在上面看到的,它似乎打印了包含“ALPHA”m的日志的其余部分,而不考虑“ALPHA本身”

预期结果应该是:

       SOH
         +++ skdfhahjsahsdjk >
        ** BETA EDFJDJFKLJDKFJKSDLFJL
           SDFSDGDRGRTG
           WEFETTFYRT #168113++-
       SOH
        ** Gama EDFJDJFKLJDKFJKSDLFJL
           SDFSDGDRGRTG
           WEFETTFYRT #168113++-
因此,它根本不应该打印包含“ALPHA”的日志

如果您能提出任何解决方案,我将不胜感激


谢谢大家!

您应该提供包含要打印的记录和要跳过的记录的示例输入。(带和不带
ALPHA
)在当前示例中,所有带
**
的记录都包含
ALPHA
。您还应该显示示例输入的预期输出。引用“特殊字符^A”的文本与示例输入和脚本不匹配。如果
SOH
实际上是指相应的ASCII字符
^A
(Strg+A),则应在文本中明确说明这一点。脚本使用文本
SOH
,而不是控制字符。或者省略此项,并始终使用文本
SOH
。嗨!谢谢你,博多。我只是按照你的建议编辑了这个问题。你应该提供包含要打印的记录和要跳过的记录的示例输入。(带和不带
ALPHA
)在当前示例中,所有带
**
的记录都包含
ALPHA
。您还应该显示示例输入的预期输出。引用“特殊字符^A”的文本与示例输入和脚本不匹配。如果
SOH
实际上是指相应的ASCII字符
^A
(Strg+A),则应在文本中明确说明这一点。脚本使用文本
SOH
,而不是控制字符。或者省略此项,并始终使用文本
SOH
。嗨!谢谢你,博多。我只是按照你的建议编辑了这个问题。