¿Cómo puedo leer un cierto número de líneas después de encontrar algún texto?
P.ej.:
Lea las siguientes 2 líneas después de encontrar "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" en el último ejemplo es un argumento y, por lo tanto, puede ser cualquier otro texto.
Lo que tengo:
Todavía estoy sin ideas, solo necesito una luz. Pensando en crear otro script para hacer eso.
$
signo al comienzo de mi respuesta es el símbolo del sistema, no parte delawk
comando.awk '/^UNIX$/ {s=NR;next} s && NR<=s+2'
Una
grep
solución:Explicación:
-A
significa: imprimir las dos líneas siguientes después del partidoO
awk:
Explicación: Esa declaración busca UNIX en la línea (
$0=="UNIX"
). Si se da eso, obtiene el siguiente siguiente en su búfer (getline
) e imprime el búfer (print
). Esto se hace dos veces.O use
sed
:Explicación: Eso sella para UNIX (
/^UNIX$/
). Si se encuentra esto, ejecuta la parte en el{...}
.n
significa siguiente,p
significa imprimir. Esto se hace dos veces también.fuente
getline; print;
parte en elawk
enunciado o lan;p;
parte en elsed
enunciado.grep -A100 -P '^UNIX$' file | tail -n +2
. La parte de la cola es eliminar el primer gravamen. En los otros (sed, awk) tendrías que escribir bucles, lo que lo hace menos simple.La página de manual de grep describe la opción así:
fuente
UNIX
en la salida.UNIX
, tubería atail
:[...] | tail -n +1
o ased
:[...] | sed '1d'
.tail
ysed '1d'
funcionan correctamente solo siUNIX
aparece una sola vez en el texto de entrada. Todas las otras respuestas permiten múltiples ocurrencias. Podría ser mejor sugerir... | grep -v UNIX
. Es cierto que esto se vuelve desordenado siUNIX
aparece en las líneas 15 y 17.sed
con alguna forma desed '/UNIX/d;n;n;p/' /path/to/file
, que acabo de descubrir y envié como respuesta.Esto parece hacer el truco muy bien:
Prueba de concepto:
fuente
for
ciclo no es necesaria.Puedes usar
ex
:dónde:
1,/UNIX/d
- elimina el texto después del partido%p
- imprime el búferq!
- Salga sin guardar los cambios en el archivo (usewq
para editar en el lugar)fuente