Tengo un problema con los correos. Necesito recibir todos los mensajes entre 2 personas:
[email protected]
y [email protected]
.
El 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>
Intenté usar lo siguiente sed
:
sed -n "/From: [Ss]omebody1/,/From: /p" inputfile > test.txt
Como resultado, recibí todos los correos electrónicos de alguien1 para test.txt
archivarlos.
La pregunta es: ¿Cuál debería ser la estructura para sed
recibir solo correos electrónicos entre alguien1 y una persona?
Respuesta1
Con sed
:
sed -n '/^From: [email protected]/{h;n;/^to: [email protected]/{H;g;p;:x;n;p;s/.//;tx}}' file
/^From: [email protected]/
: primero busque laFrom:
dirección de correo electrónicoh;
almacene esa línea en el espacio de espera.n;
cargar la siguiente línea (lato:
línea).
/^to: [email protected]/
: busca lato:
dirección de correo electrónicoH;
agregue esa línea al espacio de espera.g;
copie el espacio de retención al espacio del patrón.p;
imprimir el espacio del patrón.:x;
establezca una etiqueta llamadax
.n;
cargar la siguiente línea (el cuerpo del correo electrónico)p;
imprimir esa línea.s/.//
haz una sustitución en esa línea (solo reemplaza un carácter)...tx
... que elt
comando pueda comprobar si esa sustitución es exitosa (cuando la línea no está vacía, como al final del cuerpo del correo electrónico). En caso afirmativo, vuelva a la etiquetax
y repita hasta que aparezca una línea vacía; de lo contrario, salte al final del guión.
La salida:
From: [email protected]
to: [email protected]
<body of the message1>
From: [email protected]
to: [email protected]
<body of the message1>
Respuesta2
Con 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} \
Ponga una variable de bandera en 1 al coincidir y salte la línea./to\: person1/
Si la bandera es 1, actualícela a 2; de lo contrario, reiníciela a 0./From/{flag=0}
En el partido, restablece el valor de la bandera.{if (flag==2){print NR, $0}}
si la bandera es 2 imprimirá elnúmero de líneay la línea.
Cambie el valor de person1
para tener diferentes coincidencias.
Archivo de entrada utilizado
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>