awk 中的字边界

问题描述 投票:0回答:1

我正在尝试提取包含单词“at”的行并写下此内容

        awk '
            BEGIN { IGNORECASE = 1 }
            /(failed|caused by|errorcode|error code)/ { 
                    if ($0 ~ /exception/ && $0 ~ /(failed|caused by|errorcode|error code)/) {
                    f=1 
                    }
            }
  
            f { 
                    print NR ": ", $0
            }

            f && /at/ { 
                    next 
            }
  
            f && !/at/ { 
                    f=0 
            }
        ' "$log_file"

这段代码有效,但它也捕获了“attachment”“attraction”之类的单词,但我想要的是完全匹配单词“at”。所以我也尝试像这样设置单词边界

awk '
            BEGIN { IGNORECASE = 1 }
            /(failed|caused by|errorcode|error code)/ { 
                    if ($0 ~ /exception/ && $0 ~ /(failed|caused by|errorcode|error code)/) {
                    f=1 
                    }
            }
  
            f { 
                    print NR ": ", $0
            }

            f && /\bat\b/ { 
                    next 
            }
  
            f && !/\bat\b/ { 
                    f=0 
            }
        ' "$log_file"

但它什么也没打印。然后我尝试了这个

awk '
            BEGIN { IGNORECASE = 1 }
            /(failed|caused by|errorcode|error code)/ { 
                    if ($0 ~ /exception/ && $0 ~ /(failed|caused by|errorcode|error code)/) {
                    f=1 
                    }
            }
  
            f { 
                    print NR ": ", $0
            }

            f && /\Bat\B/ { 
                    next 
            }
  
            f && !/\Bat\B/ { 
                    f=0 
            }
        ' "$log_file"

它只打印几行带有单词“at”的行。也试过这个

awk '
            BEGIN { IGNORECASE = 1 }
            /(failed|caused by|errorcode|error code)/ { 
                    if ($0 ~ /exception/ && $0 ~ /(failed|caused by|errorcode|error code)/) {
                    f=1 
                    }
            }
  
            f { 
                    print NR ": ", $0
            }

            f && /\<at\>/ { 
                    next 
            }
  
            f && !/\<at\>/ { 
                    f=0 
            }
        ' "$log_file"

但是没有用。 有人可以帮忙吗?提前致谢。另外请解释 awk 中 和 \B 之间的区别。

regex bash awk
1个回答
0
投票

杀伤力太大。

awk ' BEGIN { IGNORECASE = 1 }
      /(failed|caused by|errorcode|error code)/ {           # tested here
        if ($0 ~ /exception/ && 
            $0 ~ /(failed|caused by|errorcode|error code)/) # why again here?
        { f=1 }                                             # why a flag?
      }
      f { print NR ": ", $0 } # why a block? Do this instead of setting f
      f && /\<at\>/ { next }  # why check at? 
      f && !/\<at\>/ { f=0 }  # most "caused by" lines trigger this...
 ' $file

如果您只想显示带有

/exception/
/(failed|caused by|errorcode|error code)/
的线条,那么就这样做。您多余的线路只会引起问题。

您需要的一切:

awk ' BEGIN { IGNORECASE = 1 }
      /exception/ && /(failed|caused by|errorcode|error code)/ { print NR ": ", $0 }
  ' $file

如果你想要看到“at”行,你需要这么说,因为你的逻辑似乎试图排除它们。

© www.soinside.com 2019 - 2024. All rights reserved.