Quiero "grep" desde la "línea 2A" hasta el final del archivo:
sed -n '/2A/,$p'
- -n :suprimir
sed
salida predeterminada - /2A/ :líneas de salida desde la primera que contiene "2A"
- $ :hasta el final del archivo
Quiero "grep" de la "línea 2A" a la siguiente línea que contiene "A":
sed -n '/2A/,/A/p'
- /A/ :salida hasta que una línea contenga "A"
Quiero "grep" desde la primera línea que contiene "A" hasta la siguiente:
printf "/A\n.+1,/A/p\nq" | ed -s
$ > foo echo "line 1
line 2A
line 3
line 4A
line 5"
$ sed -n '/2A/,$p' foo
line 2A
line 3
line 4A
line 5
$ sed -n '/2A/,/A/p' foo
line 2A
line 3
line 4A
$ printf "/A\n.+1,/A/p\nq" | ed -s foo
line 2A
line 3
line 4A
(ampliado del comentario)
awk
tiene la capacidad de seleccionar 'rangos' de líneas que se adaptan perfectamente a esta necesidad, como se describe en el manual de GNU-awk (gawk). (Esta característica funciona en otros awk
s pero el gawk
el manual es fácil de vincular).
awk '/line 2A/,0'
imprime líneas comenzando con la primera que coincide con line 2A
y continuando hasta el final de la entrada porque 0
es una condición que nunca es cierta.
awk '/line 2A/,/A/&&!/line 2A/'
comienza a imprimir con una línea que coincide con line 2A
y se detiene después de una línea que coincide con A
pero NO line 2A
(y por lo tanto no puede ser la misma línea que la línea inicial). Comenzará de nuevo en un subsecuente line 2A
y así; si quieres evitarlo, hay formas un poco más complicadas de hacerlo.
Si las líneas de parada siempre tienen algún carácter que no sea 2
antes del A
esto se puede simplificar a awk '/line 2A/,/[^2]A/'
que se detiene después de una línea que coincide con cualquier carácter que no sea 2, seguido de A. Es posible que desee una variación de esto, p. para detenerse en cualquier dígito A diferente de 2A, pero no en otro A como WHAT
; para eso, la condición de parada podría ser ,/line [013-9]A/
.
Creo que la mejor manera es usar grep
en combinación con cut
y tail
. Primero, use grep para obtener la línea en la que se encuentra la cadena deseada (-n
al número de línea de salida; -m 1
para dejar de buscar después de la primera coincidencia):
grep -n -m 1 "somestring" filename.txt
Esto genera el número de línea y la propia cadena. Para cortar la cuerda, usamos cut (-f1
:primer campo de salida; -d:
use ":" como delimitador):
grep -n -m 1 "somestring" filename.txt | cut -f1 -d:
A continuación, usamos la salida de este comando como parámetro en la cola. Normalmente, tail imprime las últimas k líneas, pero usando -n +k
, obtenemos cola para imprimir desde la línea k en adelante. El comando total es:
tail -n +`grep -n -m 1 "somestring" filename.txt | cut -f1 -d:` filename.txt
Para generar las líneas hasta somestring
usa head
en lugar de tail
y -n -#
en lugar de -n +#
. También puede combinar ambos para obtener las líneas de una cadena a otra.