web-dev-qa-db-fra.com

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

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

green
blue
cyan
Magenta
purple
brown
yellow
red
orange
more orange
more blue
this is enough
8
john smith

AWK Utilisez AWK - c'est le plus simple possible:

awk '/yellow/,0' textfile.txt

Échantillon échantillon

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

Grep

Vous pouvez également utiliser grep avec l'option --after-context pour imprimer un certain nombre 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 première ligne comme correspondance et que vous voulez tout imprimer après cette correspondance, vous devez connaître le nombre de lignes dans le fichier moins 1. Heureusement, --after-context ne jette pas des erreurs sur le nombre de lignes, vous pouvez donc donner un nombre complètement hors limites, mais si vous ne le connaissez pas, le nombre total de lignes suffira

$ 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-context est la même option que -A et $(wc -l textfile.txt), augmentera le nombre de lignes suivi du nom du fichier. Ainsi, vous tapez textfile.txt 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 printable flag

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

Vous pouvez le faire en:

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

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

5
Pilot6

Pas grep, mais en utilisant sed:

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

En retard à la fête :)

Utiliser 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 par une 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 du jeton . (n'importe quel caractère)

  • Dans \n\K, \n correspond à une nouvelle ligne, \K ignore la correspondance.

  • yellow\n.* correspond à yellow suivi d'un retour à la 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 le petit 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 les nouvelles lignes également)

  • lines.index('yellow\n') nous donne l'indice le plus bas de linesyellow\n est trouvé

  • lines[lines.index('yellow\n'):] utilisera le découpage en liste pour obtenir la partie commençant par yellow\n jusqu'à la fin.

  • join joindra les éléments de la liste pour générer une chaîne

5
heemayl

Puisque la question fait référence à visionner le fichier, il y a toujours le bon vieux

less +/yellow file
4
steeldriver