GNU/Linux >> Tutoriales Linux >  >> Linux

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

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.


Linux
  1. Uso de Google Drive desde la línea de comandos de Linux

  2. ¿Dibujar aleatoriamente un cierto número de líneas de un archivo de datos?

  3. Ir al principio o al final del archivo en Vim [Consejo rápido]

  4. Cómo contar líneas en un archivo en UNIX/Linux

  5. Linux:compruebe si hay una línea vacía al final de un archivo

Programe hardware desde la línea de comandos de Linux

Copie un archivo a varios directorios desde la línea de comandos en Linux

Trabajando con tuberías en la línea de comando de Linux

Ver el contenido de un archivo en la línea de comandos de Linux

Cómo encontrar las líneas más largas en un archivo en Linux

5 comandos para ver el contenido de un archivo en la línea de comandos de Linux