¿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 grep
solución:
grep -A2 -P '^UNIX$' file
Explicación: -A
significa: 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 {...}
. n
significa siguiente, p
significa imprimir. Esto también se hace dos veces.
Respuesta2
Una awk
solución:
$ awk '$0 == "UNIX" {i=1;next};i && i++ <= 2' file
Test 5
Test 6
Explicación
/^UNIX$/{i=1;next}
: si vemosUNIX
, configuramos la variablei = 1
y procesamos a la siguiente entrada.Si
i
se establece la variable (lo que significa que vimosUNIX
),i && i++ <= 2
solo se evalúa al valor verdadero en las dos líneas siguientes despuésUNIX
, lo que provocaawk
que se realice la acción predeterminadaprint $0
.Antes de ver
UNIX
,i
no estaba definido y comenzaba en la tercera línea despuésUNIX
,i
tenía un valor mayor que 2, lo que hace que la expresióni && i++ <= 2
se evalúe como falsa, lo que provoca queawk
no 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:
1,/UNIX/d
-elimina el texto después de la coincidencia%p
- búfer de impresionesq!
- salir sin guardar los cambios en el archivo (úselowq
para editar en el lugar)