Sed/Awk guarda texto entre patrones si contiene una cadena

Sed/Awk guarda texto entre patrones si contiene una cadena

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.txtarchivarlos.

La pregunta es: ¿Cuál debería ser la estructura para sedrecibir 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 la From:dirección de correo electrónico
    • h;almacene 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 retención al espacio del patrón.
    • p;imprimir el espacio del patrón.
    • :x;establezca una etiqueta llamada x.
    • 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 el tcomando 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 etiqueta xy 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 person1para 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>

información relacionada