Estou enfrentando um problema com e-mails. Preciso receber todas as mensagens entre 2 pessoas:
[email protected]
e [email protected]
.
O file
:
From: [email protected]
to: [email protected]
<body of the message1>
From: [email protected]
to: [email protected]
<body of the message1>
From: [email protected]
to: [email protected]
<body of the message1>
From: [email protected]
to: [email protected]
<body of the message1>
From: [email protected]
to: [email protected]
<body of the message1>
Eu tentei usar o seguinte sed
:
sed -n "/From: [Ss]omebody1/,/From: /p" inputfile > test.txt
Como resultado, recebi todos os e-mails de alguém1 para test.txt
arquivar.
A pergunta é: Qual deve ser a estrutura para sed
receber apenas e-mails entre alguém1 e pessoa?
Responder1
Com sed
:
sed -n '/^From: [email protected]/{h;n;/^to: [email protected]/{H;g;p;:x;n;p;s/.//;tx}}' file
/^From: [email protected]/
: primeira pesquisa peloFrom:
endereço de e-mailh;
armazene essa linha no espaço de espera.n;
carregue a próxima linha (ato:
linha).
/^to: [email protected]/
: procure oto:
endereço de e-mailH;
anexe essa linha ao espaço de espera.g;
copie o espaço de espera para o espaço padrão.p;
imprima o espaço do padrão.:x;
defina um rótulo chamadox
.n;
carregue a próxima linha (o corpo do email)p;
imprima essa linha.s/.//
faça uma substituição nessa linha (basta substituir um caractere)...tx
... que ot
comando possa verificar se aquela substituição foi bem sucedida (quando a linha não está vazia, como no final do corpo do email). Se sim, volte para o rótulox
e repita até que uma linha vazia apareça, se não, pule para o final do script.
A saída:
From: [email protected]
to: [email protected]
<body of the message1>
From: [email protected]
to: [email protected]
<body of the message1>
Responder2
Com awk:
awk '/From: [Ss]omebody1/{flag=1;next} \
/to\: person1/ {if (flag>0) {flag=2; print; next} else {flag=0; next}} \
/From/{flag=0} {if (flag==2){print NR,flag, $0}} ' input.txt
/From: [Ss]omebody1/{flag=1;next} \
Coloque uma variável de flag em 1 na partida e pule a linha./to\: person1/
Se o sinalizador for 1, atualize-o para 2, caso contrário, redefina-o para 0./From/{flag=0}
Na partida, ele redefiniu o valor do sinalizador.{if (flag==2){print NR, $0}}
se o sinalizador for 2, ele imprimirá onúmero da linhae a linha.
Altere o valor de person1
para ter correspondências diferentes.
Arquivo de entrada usado
From: [email protected]
to: [email protected]
<body of the message1>
From: [email protected]
to: [email protected]
<body of the message2>
From: [email protected]
to: [email protected]
<body of the message3>
From: [email protected]
to: [email protected]
<body of the message4>
From: [email protected]
to: [email protected]
<body of the message5>