text1 text2 Pattern1 text3 text4 Pattern1 text5 text2 text6 Pattern1 text7 text8 Pattern2 text2 text9 text10 text2 Pattern1 text11 text12 Pattern1 text13 text14 Pattern1 text15 text16 Pattern2 text1 text2 Pattern1 text3 text4 Pattern1 text5 text6 Pattern1 text7 text2 text8 Pattern2 text21 text22Quiero imprimir SOLAMENTE
Pattern1 text7 text8 Pattern2 Pattern1 text15 text16 Pattern2 Pattern1 text7 text2 text8 Pattern2es decir, si Pattern1 es seguido por Pattern2, entonces imprima líneas entre Pattern1 y Pattern2. No quiero líneas si Pattern1 es seguido por Pattern1.
Un comando awk es muy apreciado.
Estaba intentando como:
awk '/Pattern1/,/Pattern2' file \> outputpero también da todos los carriles que aparecen entre dos Pattern1 sucesivos.
Puedes usar este awk :
awk ' /^Pattern1$/ {s = $0 ORS; next} s != "" {s = s $0 ORS} /^Pattern2$/ {printf "%s", s; s = ""} ' file Pattern1 text7 text8 Pattern2 Pattern1 text15 text16 Pattern2 Pattern1 text7 text2 text8 Pattern2$ awk ' /Pattern1/,/Pattern2/ { # between the first start and end markers if(/Pattern1/) # at the begin marker... b=$0 # ... reset buffer else b=b ORS $0 # or keep on buffering if(/Pattern2/) # at the end marker... print b # ... it is time to output }' file head -4 de salida:
Pattern1 text7 text8 Pattern2 ...Hacer un montón de suposiciones sobre requisitos no declarados, como si coincidir con el primer o el último Patrón2, qué hacer si falta uno u otro en un archivo, qué hacer si ambos "patrones" aparecen en 1 línea, etc.:
$ cat tst.awk /Pattern1/ { f=1; rec="" } f { rec = rec $0 ORS if ( /Pattern2/ ) { printf "%s", rec f = 0 } } $ awk -f tst.awk file Pattern1 text7 text8 Pattern2 Pattern1 text15 text16 Pattern2 Pattern1 text7 text2 text8 Pattern2Consulte también ¿Cómo encuentro el texto que coincide con un patrón? .