¿Cómo leer ciertas líneas después de encontrar un texto?

¿Cómo leer ciertas líneas después de encontrar un texto?

¿Cómo puedo leer una cierta cantidad de líneas después de encontrar un texto?

P.ej.:

Lea las siguientes 2 líneas después de buscar "Unix" en:

Test 1
Test 2
Test 3
Test 4
UNIX
Test 5
Test 6
Test 7
Test 8
Test 9

El resultado puede ser:

Test 5
Test 6

Nota: El "Unix" del último ejemplo es un argumento y, por lo tanto, puede ser cualquier otro texto.

Lo que tengo:

Todavía no tengo ideas, solo necesito una luz. Pensando en crear otro script para hacer eso.

Respuesta1

Una grepsolución:

grep -A2 -P '^UNIX$' file

Explicación: -Asignifica: imprimir las siguientes dos líneas después del partido

Oawk:

awk '$0=="UNIX"{getline; print; getline; print}' file

Explicación:Busque UNIX en la línea ( $0=="UNIX"). Si lo encuentra, coloque la siguiente línea en el búfer ( getline) e imprima el búfer ( print). Esto se hace dos veces.

O usar sed:

sed -n '/^UNIX$/{n;p;n;p}' file

Explicación:Busque UNIX ( /^UNIX$/). Si lo encuentra, ejecute la parte del archivo {...}. nsignifica siguiente, psignifica imprimir. Esto también se hace dos veces.

Respuesta2

Una awksolución:

$ awk '$0 == "UNIX" {i=1;next};i && i++ <= 2' file
Test 5
Test 6

Explicación

  • /^UNIX$/{i=1;next}: si vemos UNIX, configuramos la variable i = 1y procesamos a la siguiente entrada.

  • Si ise establece la variable (lo que significa que vimos UNIX), i && i++ <= 2solo se evalúa al valor verdadero en las dos líneas siguientes después UNIX, lo que provoca awkque se realice la acción predeterminada print $0.

  • Antes de ver UNIX, ino estaba definido y comenzaba en la tercera línea después UNIX, itenía un valor mayor que 2, lo que hace que la expresión i && i++ <= 2se evalúe como falsa, lo que provoca que awkno se haga nada.

Respuesta3

grep -A 2 UNIX file.txt

La página de manual de grep describe la opción así:

  -A NUM, --after-context=NUM
      Print NUM  lines  of  trailing  context  after  matching  lines.
      Places  a  line  containing  --  between  contiguous  groups  of
      matches.

Respuesta4

Puedes usar ex:

ex -s +'1,/UNIX/d|%p|q!' file_or_/dev/stdin

dónde:

información relacionada