“问题”...该命令正在执行实际指示的操作。
给定此 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。
笔记
对 shell 变量使用全部大写是不好的做法。系统对其变量使用全部大写,您不想意外覆盖其中之一。
cat
是不需要的。 awk 将文件名作为参数。在正则表达式中,
:
和 空格并不特殊。他们不需要逃跑。在电子邮件标题中,
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 格式,添加的注释已被删除。