Solución:
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 de la primera que contiene “2A”
- $: al 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” de la primera línea que contiene “A” a la siguiente:
printf "/An.+1,/A/pnq" | 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 "/An.+1,/A/pnq" | ed -s foo
line 2A
line 3
line 4A
(ampliado del comentario)
awk
tiene la capacidad de seleccionar ‘rangos’ de líneas que se adapten perfectamente a esta necesidad, como se describe en el manual GNU-awk (gawk). (Esta función 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 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 line 2A
y se detiene después de una línea que coincide A
pero no line 2A
(y por lo tanto no puede ser la misma línea que la línea de salida). Se iniciará de nuevo en un subsecuente line 2A
etcétera; si desea evitarlo, hay formas un poco más complicadas de hacerlo.
Si las líneas de parada siempre tienen algún carácter diferente a 2
antes de 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, por ejemplo, que se detenga en cualquier dígito A diferente de 2A, pero no en otro As como WHAT
; por eso la condición de parada podría ser ,/line [013-9]A/
.
Creo que la mejor forma es utilizar grep
en combinación con cut
y tail
. Primero, use grep para obtener la línea en la que está la cadena deseada (-n
para dar salida al número de línea; -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 cadena en sí. 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 tail. Normalmente, tail imprime las últimas k líneas, pero usando -n +k
, obtenemos tail 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 dar salida a las líneas hasta somestring
usar 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.