Je veux "grep" de la "ligne 2A" à la fin du fichier :
sed -n '/2A/,$p'
- -n :supprime
sed
sortie par défaut - /2A/ :lignes de sortie de la première contenant "2A"
- $ :vers la fin du fichier
Je veux "grep" de la "ligne 2A" à la ligne suivante qui contient "A":
sed -n '/2A/,/A/p'
- /A/ :sortie jusqu'à ce qu'une ligne contienne "A"
Je veux "grep" de la première ligne contenant "A" à la suivante :
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
(développé à partir du commentaire)
awk
a la capacité de sélectionner des "gammes" de lignes qui correspondent parfaitement à ce besoin, comme décrit dans le manuel GNU-awk (gawk). (Cette fonctionnalité fonctionne dans d'autres awk
s mais le gawk
le manuel est facile à lier.)
awk '/line 2A/,0'
imprime les lignes commençant par la première qui correspond à line 2A
et continue jusqu'à la fin de la saisie car 0
est une condition qui n'est jamais vraie.
awk '/line 2A/,/A/&&!/line 2A/'
commence l'impression avec une ligne qui correspond à line 2A
et s'arrête après une ligne qui correspond à A
mais PAS line 2A
(et ne peut donc pas être la même ligne que la ligne de départ). Ça va recommencer sur une suite line 2A
etc; si vous voulez éviter cela, il existe des moyens légèrement plus compliqués de le faire.
Si les lignes d'arrêt ont toujours un caractère autre que 2
avant le A
cela peut être simplifié en awk '/line 2A/,/[^2]A/'
qui s'arrête après une ligne qui correspond à n'importe quel caractère autre que 2, suivi de A. Vous voudrez peut-être une variante de ceci, par ex. pour s'arrêter sur n'importe quel A à un seul chiffre différent de 2A, mais pas d'autre comme WHAT
; pour cela la condition d'arrêt pourrait être ,/line [013-9]A/
.
Je pense que la meilleure façon est d'utiliser grep
en combinaison avec cut
et tail
. Tout d'abord, utilisez grep pour obtenir la ligne sur laquelle se trouve la chaîne souhaitée (-n
pour sortir le numéro de ligne ; -m 1
pour arrêter la recherche après la première correspondance) :
grep -n -m 1 "somestring" filename.txt
Cela génère le numéro de ligne et la chaîne elle-même. Pour couper la chaîne, nous utilisons cut (-f1
:premier champ de sortie ; -d:
utilisez ":" comme délimiteur) :
grep -n -m 1 "somestring" filename.txt | cut -f1 -d:
Ensuite, nous utilisons la sortie de cette commande comme paramètre dans tail. Normalement, tail imprime les k dernières lignes, mais en utilisant -n +k
, nous obtenons la queue à imprimer à partir de la ligne k. La commande totale est :
tail -n +`grep -n -m 1 "somestring" filename.txt | cut -f1 -d:` filename.txt
Pour sortir les lignes jusqu'à somestring
utilisez head
au lieu de tail
et -n -#
au lieu de -n +#
. Vous pouvez également combiner les deux pour obtenir les lignes d'une chaîne à l'autre.