Sed / Awk guardar texto entre patrones si contiene cadena


2

Estoy enfrentando un problema con los correos. Necesito recibir todos los mensajes entre 2 personas: somebody1@domain.comy person@domain.com.

El file:

From: somebody1@domain.com
to: person@domain.com
<body of the message1>

From: somebody2@domain.com
to: person@domain.com
<body of the message1>

From: somebody1@domain.com
to: person@domain.com
<body of the message1>

From: somebody3@domain.com
to: person@domain.com
<body of the message1>

From: somebody5@domain.com
to: person@domain.com
<body of the message1>

Traté de usar lo siguiente sed:

sed -n "/From: [Ss]omebody1/,/From: /p" inputfile > test.txt

Como resultado, recibí todos los correos de alguien1 para test.txtarchivar.

La pregunta es: ¿Cuál debería ser la estructura sedpara obtener solo correos entre alguien1 y una persona?

Respuestas:


1

Con sed:

sed -n '/^From: somebody1@domain.com/{h;n;/^to: person@domain.com/{H;g;p;:x;n;p;s/.//;tx}}' file

  • /^From: somebody1@domain.com/: primera búsqueda de la From:dirección de correo electrónico
    • h; almacenar esa línea en el espacio de espera.
    • n;cargar la siguiente línea (la to:línea).
  • /^to: person@domain.com/: busca la to:dirección de correo electrónico
    • H; agregue esa línea al espacio de espera.
    • g; copie el espacio de espera en el espacio del patrón.
    • p; imprime el espacio del patrón.
    • :x;fijar una etiqueta llamada x.
    • n; cargar la siguiente línea (el cuerpo del correo electrónico)
    • p; imprime esa línea.
    • s/.// haga una sustitución en esa línea (solo reemplace un carácter) ...
    • tx... que el tcomando puede verificar 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 etiqueta xy repita hasta que aparezca una línea vacía, si no, salte al final del guión.

La salida:

From: somebody1@domain.com
to: person@domain.com
<body of the message1>

From: somebody1@domain.com
to: person@domain.com
<body of the message1>

Probablemente pueda obtener una salida más limpia sin la primera p;. Solo para evitar una lista de coincidencias aisladas que From: somebody1@domain.comno sean seguidas por la coincidencia en segunda persona y el bloque de la carta.
Hastur

@Hastur Buena pista, lo corregí, ahora ya no imprime coincidencias aisladas
caos el

Muchas gracias por eso. Me gustaría hacer otra pregunta: lo que debería obtener a cambio es todo el cuerpo del mensaje (que puede contener nuevos caracteres de línea) hasta la próxima aparición de "De:" En este momento obtengo más información pero no es suficiente: salida de ejemplo De: alguien1@dominio.com Para: persona@dominio.com Fecha: lunes, 06 de julio de 2015 17:41:03 GMT Asunto: *************** Tipo de contenido: ** ******************************* X-Scanned By: ************* ********* y ningún cuerpo después de él
wtk

Busque su archivo en el punto en el que detiene su fragmento, y probablemente encontrará otra vez la palabra clave From: somebody1@domain.com... Debe seleccionar una clave única diferente que no encontrará nuevamente en el cuerpo de su mensaje. Será lo mismo con la awkrespuesta. Pruébalo también.
Hastur

0

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 a 1 en el partido y omita la línea.
  • /to\: person1/ Si la bandera es 1, actualícela a 2, restablezca 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á el número de lino y la línea.

Cambie el valor de person1tener diferentes coincidencias.

Archivo de entrada utilizado

From: somebody1@domain.com
to: person2@domain.com
<body of the message1>

From: somebody2@domain.com
to: person1@domain.com
<body of the message2>

From: somebody1@domain.com
to: person1@domain.com
<body of the message3>

From: somebody1@domain.com
to: person1@domain.com
<body of the message4>

From: somebody3@domain.com
to: person@domain.com
<body of the message5>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.