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: [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>

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?

wtk
fuente

Respuestas:

1

Con sed:

sed -n '/^From: [email protected]/{h;n;/^to: [email protected]/{H;g;p;:x;n;p;s/.//;tx}}' file

  • /^From: [email protected]/: 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: [email protected]/: 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: [email protected]
to: [email protected]
<body of the message1>

From: [email protected]
to: [email protected]
<body of the message1>
caos
fuente
Probablemente pueda obtener una salida más limpia sin la primera p;. Solo para evitar una lista de coincidencias aisladas que From: [email protected]no 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: [email protected] Para: [email protected] 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: [email protected]... 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: [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>
Hastur
fuente