Linux: "grep" desde ciertas líneas hasta el final del archivo

Linux: "grep" desde ciertas líneas hasta el final del archivo

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)

awktiene 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 awkanuncios, pero el gawkmanual es fácil de vincular).

awk '/line 2A/,0'imprime líneas comenzando con la primera que coincide line 2Ay continuando hasta el final de la entrada porque 0es una condición que nunca se cumple.

awk '/line 2A/,/A/&&!/line 2A/'comienza a imprimir con una línea que coincide line 2Ay se detiene después de una línea que coincide Apero 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 2Aetcé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 2anterior, Aesto 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 sedla 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 grepen combinación con cuty tail. Primero, use grep para obtener la línea en la que está la cadena deseada ( -npara generar el número de línea; -m 1para 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 somestringsu uso headen lugar de taily -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

información relacionada