Necesito ayuda con Grep para comenzar en una sección


8

Tengo algunos archivos de texto de los que quiero obtener una sección de código. El objetivo que estoy tratando de lograr es comenzar la vista en una línea determinada y luego poder leer cualquier cosa debajo de ella. Por ejemplo. En el texto a continuación, ¿cómo puedo ver el archivo de texto en el punto de inicio de amarillo? Quiero ver el contenido de "amarillo", así como todo lo que hay debajo, independientemente de cuál sea ese contenido.

green
blue
cyan
magenta
purple
brown
yellow
red
orange
more orange
more blue
this is enough

Respuestas:


9

Uso de AWKAWK : es lo más simple posible:

awk '/yellow/,0' textfile.txt

Ejecución de la muestra

$ awk '/yellow/,0' textfile.txt                                
yellow
red
orange
more orange
more blue
this is enough

Grep

También puede usar grepcon la --after-contextopción, para imprimir cierta cantidad de líneas después del partido

grep 'yellow' --after-context=999999  textfile.txt

Para la configuración automática de contexto, puede usar $(wc -l textfile.txt). La idea básica es que si tiene una primera línea como coincidencia y desea imprimir todo después de esa coincidencia, necesitará saber la cantidad de líneas en el archivo menos 1. Afortunadamente, --after-contextno arrojará errores sobre la cantidad de líneas, por lo que podría darle un número completamente fuera de rango, pero en caso de que no lo sepa, el número total de líneas funcionará

$ grep 'yellow' --after-context=$(wc -l < textfile.txt) textfile.txt
yellow
red
orange
more orange
more blue
this is enough

Si desea acortar, el comando --after-contextes la misma opción que -Ay $(wc -l textfile.txt), se expandirá al número de líneas seguido del nombre del archivo. Así de esa manera escribes textfile.txtsolo una vez

grep "yellow" -A $(wc -l textfile.txt)

Pitón

skolodya@ubuntu:$ ./printAfter.py textfile.txt                                 
yellow
red
orange
more orange
more blue
this is enough

DIR:/xieerqi
skolodya@ubuntu:$ cat ./printAfter.py                                          
#!/usr/bin/env python
import sys

printable=False
with open(sys.argv[1]) as f:
     for line in f:
        if "yellow" in line:
           printable=True
        if printable:
           print line.rstrip('\n')

O alternativamente sin printablebandera

#!/usr/bin/env python
import sys

with open(sys.argv[1]) as f:
     for line in f:
        if "yellow" in line:
          for lines in f: # will print remaining lines
             print lines.rstrip('\n')
          exit()

Puede simplificar el grepcomando a grep "yellow" -A $(wc -l textfile.txt).
Byte Commander

@ByteCommander sí, se puede hacer también. Acabo de usar la opción completa para mayor claridad
Sergiy Kolodyazhnyy

1
@ByteCommander Qué lindo truco. Desafortunadamente, solo funciona porque no hay espacios en el nombre del archivo.
kasperd

@kasperd Oh, sí, tienes razón. En ese caso, tendrías que recurrir al comando original de Serg grep "yellow" -A $(wc -l < "my colors.txt") "my colors.txt".
Byte Commander

5

Puedes hacerlo por:

awk '/yellow/{f=1}f' file

donde "archivo" es el nombre del archivo que contiene su texto.


Grandes mentes piensan igual> :)
Sergiy Kolodyazhnyy

5

No grep, pero usando sed:

sed -n '/^yellow$/,$p' file
  • -n: inhibe la impresión
  • /^yellow$/,$: rango de direcciones que va desde la primera aparición de una línea que coincide exactamente yellowhasta la última línea inclusive
  • p: imprime las líneas en el rango de direcciones
% sed -n '/^yellow$/,$p' file
yellow
red
orange
more orange
more blue
this is enough

5

Tarde a la fiesta :)

Utilizando grep:

grep -Pzo '(?s)\n\Kyellow\n.*' file.txt
  • -P nos permite usar Regex compatible con Perl

  • -z hace que el archivo de entrada esté separado por ASCII NUL, en lugar de esa nueva línea

  • -o toma solo la porción deseada

  • (?s)es el modificador DOTALL, nos permite hacer coincidir la nueva línea utilizando token .(cualquier carácter)

  • En \n\K, \ncoincide con una nueva línea, \Kdescarta la coincidencia

  • yellow\n.*coincide yellowcon una nueva línea y todo después de esto también se selecciona y se muestra en la salida.

Ejemplo:

% grep -Pzo '(?s)\n\Kyellow\n.*' file.txt
yellow
red
orange
more orange
more blue
this is enough

Usando poco python:

#!/usr/bin/env python2
with open('file.txt') as f:
    lines = f.readlines()
    print ''.join(lines[lines.index('yellow\n'):])
  • lines es la lista que contiene todas las líneas del archivo (con líneas nuevas también)

  • lines.index('yellow\n')nos da el índice más bajo de linesdónde yellow\nse encuentra

  • lines[lines.index('yellow\n'):]utilizará el corte de lista para obtener la porción desde el principio yellow\nhasta el final

  • join unirá los elementos de la lista para generar como una cadena


Bien, pero debes mencionar que el código de Python solo encuentra líneas enteras iguales a "amarillo", no detecta, por ejemplo, líneas como "más amarillo".
Byte Commander

@ ByteCommander Desde el ejemplo de OP, creo que está claro que quieren coincidir justo yellowen la línea ... también si ese no es el caso, entonces tenemos que cambiar el pythonalgo de uno ...
heemayl

Si seguro. De todos modos, eso no fue una crítica, solo una pista para mejorar la respuesta. Alguien más que lea esto podría suponer que el código funciona grepy no coincide solo con líneas completas. Voté por cierto.
Byte Commander

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.