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
a
como verdadeiro. -
/From: [email protected]/{b=1}
Se a linha for boa, defina o sinalizador
b
como 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.