我正在尝试提取包含单词“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 之间的区别。
杀伤力太大。
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”行,你需要这么说,因为你的逻辑似乎试图排除它们。