awk 问题在两个模式之间选择行

awk 问题在两个模式之间选择行

“问题”...该命令正在执行实际指示的操作。

给定此 mbox 格式文件:

From: [email protected] #identifies the beginning of the first mail    
...
Subject: crcheck.sh #identifies the beginning of the mail body
...
MYVARIABLE="123"
...
From: [email protected] #identifies the beginning of the next mail
...
Subject: crcheck.sh #identifies the beginning of the mail body
...
From: [email protected] #identifies the beginning of next mail
...
Subject: crcheck.sh #identifies the beginning of the mail body
EVILVARIABLE="0.00" #just to mention a value that would cause division by zero errors and crash my main script.
...
From: [email protected] #identifies the beginning of the next mail
...

我需要选择有效主题:和下一个发件人:之间的所有行,但主题行之前的发件人:应该是 $GOODSENDER 。

我正在运行的代码:

GOODSUBJECT="crcheck.sh"
GOODSENDER="[email protected]"
cat $MBOX |awk "/Subject\: $GOODSUBJECT$/{a=1}/From\:\ $GOODSENDER /{print;a=0}a"|grep $i\=\"

输出:

MYVARIABLE="123"
EVILVARIABLE="0.00"

预期输出:

MYVARIABLE="123"

该命令正在按照指示执行操作,因为这些行实际上位于我设置为 awk 模式的两行之间。

但我怎样才能调整它以获得这种期望的行为呢?

答案1

尝试:

$ awk "/Subject:/{a=0} /From:/{a=0; b=0} a && b && /MYVARIABLE=/{print} /Subject: crcheck.sh$/{a=1} /From: [email protected]/{b=1}" mbox
MYVARIABLE="123"

怎么运行的

  • /Subject:/{a=0} /From:/{a=0; b=0}

    当我们到达主题或离开线路时,将所有标志设置为 false。

  • a && b && /MYVARIABLE=/{print}

    如果两个标志都为 true 并且该行包含字符串MYVARIABLE=,则打印该行。

  • /Subject: crcheck.sh$/{a=1}

    如果主题行不错,请将标志设置a为 true。

  • /From: [email protected]/{b=1}

    如果 from 行良好,则将标志设置b为 true。

笔记

  1. 对 shell 变量使用全部大写是不好的做法。系统对其变量使用全部大写,您不想意外覆盖其中之一。

  2. cat是不需要的。 awk 将文件名作为参数。

  3. 在正则表达式中,:和 空格并不特殊。他们不需要逃跑。

  4. 在电子邮件标题中,Subject:From:都应该从行首开始。每个更好的正则表达式可能是/^Subject:/行开始的正则表达式符号/^From:/在哪里。^

将变量传递给 awk

$ var=MYVARIABLE
$ awk -v x="$var" '/Subject:/{a=0} /From:/{a=0; b=0} a && b && $0 ~ (x"="){print} /Subject: crcheck.sh$/{a=1} /From: [email protected]/{b=1}' mbox
MYVARIABLE="123"

示例输入

上面的输出是使用它作为输入文件生成的:

$ cat mbox
From: [email protected]
...
Subject: crcheck.sh
...
MYVARIABLE="123"
...
From: [email protected]
...
Subject: crcheck.sh
...
From: [email protected]
...
Subject: crcheck.sh
EVILVARIABLE="0.00"
...
From: [email protected]
...

这与问题中的相同,只是为了将其恢复为 mbox 格式,添加的注释已被删除。

相关内容