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
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()
Vous pouvez le faire en:
awk '/yellow/{f=1}f' file
où "fichier" est le nom du fichier contenant votre texte.
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 inclusep
: imprime les lignes dans la plage d'adresses% sed -n '/^yellow$/,$p' file
yellow
red
orange
more orange
more blue
this is enough
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 lines
où yellow\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
Puisque la question fait référence à visionner le fichier, il y a toujours le bon vieux
less +/yellow file