Tente:
$ 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"
Como funciona
-
/Subject:/{a=0} /From:/{a=0; b=0}Quando chegamos a um assunto ou de uma linha, transformamos todas as bandeiras em falso.
-
a && b && /MYVARIABLE=/{print}Se os dois sinalizadores forem verdadeiros e a linha incluir a string
MYVARIABLE=, imprima a linha. -
/Subject: crcheck.sh$/{a=1}Se a linha de assunto estiver boa, defina o sinalizador
acomo verdadeiro. -
/From: [email protected]/{b=1}Se a linha for boa, defina o sinalizador
bcomo verdadeiro.
Notas
-
É uma prática ruim usar maiúsculas para variáveis de shell. O sistema usa todas as maiúsculas para suas variáveis e você não quer sobrescrever acidentalmente uma delas.
-
caté desnecessário. O awk pega nomes de arquivos como argumentos. -
Nas expressões regulares,
:e espaço não são especiais. Eles não precisam ser escapados. -
Nos cabeçalhos de e-mail,
Subject:eFrom:devem começar no início da linha. Um regex melhor para cada um pode ser/^Subject:/e/^From:/, em que^é o símbolo regex para o início da linha.
Passando uma variável para o 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"
Entrada de amostra
A saída acima foi gerada usando isso como o arquivo de entrada:
$ 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]
...
Isso é o mesmo da pergunta, exceto que, para restaurá-lo para o formato mbox, os comentários adicionados foram removidos.