【问题标题】:AWK if condition matching a string如果条件匹配字符串,则 AWK
【发布时间】:2015-07-08 01:38:11
【问题描述】:

我有以下 awk 命令。我正在尝试查找错误并打印错误的第一行。如果错误具有匹配的字符串,那么我会尝试将其添加到计数中,然后在 END 语句中打印结果。

如何将 if 条件用于我对以下语句的要求,并打印错误的出现次数?

awk '/^SomeError[0-9]+/ {for(i=0;i<=3;i++){getline;if(i==0 && $1 ~ /PATTERN_TO_FIND/ ){print;count++;}}} END {print count;}' SomeLogfile.log.2015-07-06 | less

今天,如果我将 if 条件与以下正则表达式一起使用,它不会打印任何内容。如果我从包含 he end 语句的命令中删除它,它会打印结果,但我想将此条件用于计数目的并打印。

$1 ~ /PATTERN_TO_FIND/

【问题讨论】:

  • for(i=0;i&lt;=3;i++) 的用途是什么?你只对i==0?的情况感兴趣
  • @NathanWilson 我还在学习。我之前打印了前 3 行。现在我只对第一行感兴趣。
  • 你能放一个输入文件的样本吗?我假设包含搜索条件的行与实际错误不在同一行?

标签: linux awk


【解决方案1】:

如果您的 PATTERN TO FIND 中有空格,请改用 $0。 $0 ~ /寻找模式/

【讨论】:

  • 您的答案将在整行中找到模式,而不仅仅是 OP 想要的第一个字段(来自问题的 AFAIK)。
  • 这实际上可能正是他想要的,尽管这与模式中的空格无关。 $1 仅表示第一个字段(由默认分隔符(空格)分隔。在这种情况下,它是匹配 SomeError 行之后立即出现的行中的第一个字段。
  • 尝试将代码放入代码块how do i format my code blocks
【解决方案2】:

这将打印以SomeError 开头的行,如果第一行的第一个字段也匹配PATTERN,则增加计数:

awk '/^SomeError/ {print;if($1 ~ /PATTERN/){count++;}} END {print count;}' filename

如果您想在第一行的任意位置计算PATTERN,请将$1 替换为$0

【讨论】:

    【解决方案3】:

    根据 msr 的回答,我自己找到了解决方案。以下命令对我有用。

    awk BEGIN {count=0;} '/^SomeError[0-9]+/ {getline;if($0 ~ /PATTERN_TO_MATCH/){print $0;count++} END {print count;}' SomeLogfile.log.2015-07-06
    

    【讨论】:

    • 您是要匹配整行的模式还是仅匹配第一个字段。 for(i=0;i&lt;1;i++) 也没有任何意义。最好去掉循环。
    • @RakholiyaJenish 实际上整行,这是我的新手错误。丁知道 0 美元和 1 美元的区别。现在我知道它们对我意味着什么。如果我删除 for 循环,它会只占用第一行吗?(从您的评论中我看起来像这样)
    • 你的循环只会让它的内容运行一次,因为i&lt;1 条件不会在下一次迭代中得到满足。因此,这与不编写 for 循环相同,因为在这两种情况下,getline, if..... 都将执行一次。你也忘了放 for 循环的右括号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 2013-04-13
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多