J'ai besoin d'aide avec Grep pour commencer une section


8

J'ai des fichiers texte à partir desquels je veux récupérer une section de code. Le but que j'essaie d'atteindre est de commencer la vue à une certaine ligne et de pouvoir lire quoi que ce soit en dessous. Par exemple. Dans le texte ci-dessous, comment afficher le fichier texte au point de départ jaune. Je souhaite afficher le contenu de "jaune" ainsi que tout ce qui se trouve en dessous, quel que soit ce contenu.

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

Réponses:


9

Utilisation d' AWKAWK - c'est la plus simple possible:

awk '/yellow/,0' textfile.txt

Exemple d'exécution

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

Grep

Vous pouvez également utiliser grepavec --after-contextoption, pour imprimer une certaine quantité de lignes après la correspondance

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

Pour le réglage automatique du contexte, vous pouvez utiliser $(wc -l textfile.txt). L'idée de base est que si vous avez une toute première ligne comme correspondance et que vous souhaitez tout imprimer après cette correspondance, vous devrez connaître le nombre de lignes dans le fichier moins 1. Heureusement, --after-contextne générera pas d'erreurs sur le nombre de lignes, vous pouvez donc lui donner un numéro complètement hors de portée, mais si vous ne le connaissez pas, le nombre total de lignes fera l'affaire

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

Si vous souhaitez raccourcir la commande, --after-contextc'est la même option que -Aet $(wc -l textfile.txt), s'étendra au nombre de lignes suivi du nom du fichier. Ainsi, vous textfile.txtne tapez qu'une seule fois

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

Python

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')

Ou bien sans printabledrapeau

#!/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()

Vous pouvez simplifier la grepcommande en grep "yellow" -A $(wc -l textfile.txt).
Byte Commander

@ByteCommander yup, peut aussi être fait. Juste utilisé l'option complète pour plus de clarté
Sergiy Kolodyazhnyy

1
@ByteCommander Quel beau hack. Malheureusement, cela ne fonctionne que parce qu'il n'y a pas d'espace dans le nom du fichier.
kasperd

@kasperd Oh oui, vous avez raison. Dans ce cas, vous devrez vous replier sur le commandement initial de Serg grep "yellow" -A $(wc -l < "my colors.txt") "my colors.txt".
Byte Commander

5

Vous pouvez le faire en:

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

où "fichier" est le nom du fichier contenant votre texte.


Les grands esprits pensent de la même façon> :)
Sergiy Kolodyazhnyy

5

Non grep, mais en utilisant sed:

sed -n '/^yellow$/,$p' file
  • -n: inhibe l'impression
  • /^yellow$/,$: plage d'adresses qui va de la première occurrence d'une ligne correspondant exactement yellowà la dernière ligne incluse
  • p: imprime les lignes de la plage d'adresses
% sed -n '/^yellow$/,$p' file
yellow
red
orange
more orange
more blue
this is enough

5

Tard à la fête :)

En utilisant grep:

grep -Pzo '(?s)\n\Kyellow\n.*' file.txt
  • -P nous permet d'utiliser Regex compatible Perl

  • -z rend le fichier d'entrée séparé par ASCII NUL, plutôt que la nouvelle ligne

  • -o ne prend que la portion désirée

  • (?s)est le modificateur DOTALL, nous permet de faire correspondre la nouvelle ligne à l'aide d'un jeton .(n'importe quel caractère)

  • Dans \n\K, \ncorrespond à une nouvelle ligne, \Ksupprime la correspondance

  • yellow\n.*correspond yellowà une nouvelle ligne et tout ce qui suit est également sélectionné et affiché dans la sortie.

Exemple:

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

Utiliser peu python:

#!/usr/bin/env python2
with open('file.txt') as f:
    lines = f.readlines()
    print ''.join(lines[lines.index('yellow\n'):])
  • lines est la liste contenant toutes les lignes du fichier (avec des retours à la ligne finaux aussi)

  • lines.index('yellow\n')nous donne l'indice le plus bas linesyellow\nse trouve

  • lines[lines.index('yellow\n'):]utilisera le découpage de liste pour obtenir la portion de la yellow\nfin à la fin

  • join joindra les éléments de la liste pour produire une chaîne


Bien, mais vous devez mentionner que le code Python ne trouve que des lignes entières égales à "jaune", il ne détecte pas par exemple les lignes comme "plus jaune".
Byte Commander

@ByteCommander D'après l'exemple de OP, je pense qu'il est clair qu'ils veulent correspondre juste yellowdans la ligne .. aussi si ce n'est pas le cas, alors nous devons changer l' pythonalgo de son ..
heemayl

Oui bien sûr. Ce n'était pas une critique de toute façon, juste un indice pour améliorer la réponse. Quelqu'un d'autre qui lit ceci peut supposer que le code fonctionne comme grepet ne correspond pas uniquement aux lignes complètes. J'ai voté contre btw.
Byte Commander

4

Puisque la question se réfère à la visualisation du fichier, il y a toujours le bon vieux '

less +/yellow file

Je ne savais pas lesspouvoir faire ça. Très agréable !
Sergiy Kolodyazhnyy
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.