Tengo un archivo de texto similar a este:
line 1
line 2A
line 3
line 4A
line 5
Quiero "grep" desde la "línea 2A" hasta el final del archivo, algo como esto
cat file.txt|some_grep "line 2A"
Además, quiero "grep" de la "línea 2A" a la siguiente línea que contiene "A", algo como esto
cat file.txt| some_grep "A"
Quiero imprimir esto:
line 2A
line 3
line 4A
¿Qué comando puede ayudarme a lograr esto?
Respuesta1
(ampliado del comentario)
awk
tiene la capacidad de seleccionar 'rangos' de líneas que se adaptan perfectamente a esta necesidad, comodescrito en el manual GNU-awk (gawk). (Esta función funciona en otros awk
anuncios, pero el gawk
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 se cumple.
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 inicial). Se iniciaráde nuevoen unsubsecuente line 2A
etcétera; Si desea evitarlo, existen formas un poco más complicadas de hacerlo.
Si las líneas de parada siempre tienen algún carácter distinto al 2
anterior, A
esto se puede simplificar a awk '/line 2A/,/[^2]A/'
que se detenga después de una línea que coincida con cualquier carácter que no sea 2, seguido de A. Es posible que desee una variación de esto, por ejemplo, detenerse en cualquier carácter único. dígito-A diferente de 2A, pero no otros As similares WHAT
; para eso la condición de parada podría ser ,/line [013-9]A/
.
Respuesta2
Quiero "grep" desde la "línea 2A" hasta el final del archivo:
sed -n '/2A/,$p'
- -n: suprime
sed
la salida predeterminada - /2A/: líneas de salida de 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" a 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
Respuesta3
Creo que la mejor manera es usarlo 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 generar el número de línea; -m 1
para detener la búsqueda después de la primera coincidencia):
grep -n -m 1 "somestring" filename.txt
Esto genera el número de línea y la cadena misma. Para cortar la cadena, usamos cut ( -f1
: genera el primer campo; -d:
usa ":" 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 al usar -n +k
, conseguimos que tail imprima 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
su uso head
en lugar de tail
y -n -#
en lugar de -n +#
. También puedes combinar ambos para obtener las líneas de una cadena a otra.
Respuesta4
Pruebe el siguiente código:
sed -n '6,$p' infile