120 votes

Comment rechercher le contenu après un motif ?

Étant donné un fichier, par exemple :

potato: 1234
apple: 5678
potato: 5432
grape: 4567
banana: 5432
sushi: 56789

J'aimerais rechercher toutes les lignes qui commencent par potato: mais seulement pipe les numéros qui suivent potato: . Ainsi, dans l'exemple ci-dessus, la sortie serait :

1234
5432

Comment puis-je faire ça ?

162voto

rid Points 24625
grep 'potato:' file.txt | sed 's/^.*: //'

grep recherche toute ligne qui contient la chaîne de caractères potato: puis, pour chacune de ces lignes, sed remplace ( s/// - substituer) tout caractère ( .* ) depuis le début de la ligne ( ^ ) jusqu'à la dernière occurrence de la séquence : (deux-points suivis d'un espace) avec la chaîne vide ( s/...// - remplacer la première partie par la deuxième partie, qui est vide).

ou

grep 'potato:' file.txt | cut -d\   -f2

Pour chaque ligne qui contient potato: , cut divisera la ligne en plusieurs champs délimités par des espaces ( -d\ - d = délimiteur, \ = caractère d'espace échappé, quelque chose comme -d" " aurait également fonctionné) et d'imprimer le deuxième champ de chacune de ces lignes ( -f2 ).

ou

grep 'potato:' file.txt | awk '{print $2}'

Pour chaque ligne qui contient potato: , awk imprimera le deuxième champ ( print $2 ) qui est délimité par défaut par des espaces.

ou

grep 'potato:' file.txt | perl -e 'for(<>){s/^.*: //;print}'

Toutes les lignes qui contiennent potato: sont envoyés à un système en ligne ( -e ) Perl script qui prend toutes les lignes de stdin puis, pour chacune de ces lignes, effectue la même substitution que dans le premier exemple ci-dessus, puis l'imprime.

ou

awk '{if(/potato:/) print $2}' < file.txt

Le fichier est envoyé via stdin ( < file.txt envoie le contenu du fichier via stdin à la commande de gauche) à un awk script qui, pour chaque ligne qui contient potato: ( if(/potato:/) retourne vrai si l'expression régulière /potato:/ correspond à la ligne courante), imprime le deuxième champ, comme décrit ci-dessus.

ou

perl -e 'for(<>){/potato:/ && s/^.*: // && print}' < file.txt

Le fichier est envoyé via stdin ( < file.txt voir ci-dessus) à un script Perl qui fonctionne de manière similaire à celui ci-dessus, mais cette fois, il s'assure également que chaque ligne contient la chaîne de caractères potato: ( /potato:/ est une expression régulière qui correspond si la ligne courante contient potato: et, si c'est le cas ( && ), puis procède à l'application de l'expression régulière décrite ci-dessus et imprime le résultat).

79voto

mohit6up Points 704

Ou utilisez des assertions regex : grep -oP '(?<=potato: ).*' file.txt

17voto

tuxutku Points 71
grep -Po 'potato:\s\K.*' file

-P pour utiliser l'expression régulière Perl

-o pour afficher uniquement la correspondance

\s pour correspondre à l'espace après potato:

\K pour omettre la correspondance

.* pour correspondre au reste de la ou des chaînes

13voto

thb Points 4370
sed -n 's/^potato:[[:space:]]*//p' file.txt

On peut considérer Grep comme un Sed restreint, ou Sed comme un Grep généralisé. Dans ce cas, Sed est un bon outil léger qui fait ce que vous voulez - bien que, bien sûr, il existe plusieurs autres façons raisonnables de le faire, aussi.

2voto

Chris Koknat Points 1732

Ceci imprimera tout après chaque correspondance, sur cette même ligne uniquement :

perl -lne 'print $1 if /^potato:\s*(.*)/' file.txt

Ceci fera la même chose, sauf qu'il imprimera également toutes les lignes suivantes :

perl -lne 'if ($found){print} elsif (/^potato:\s*(.*)/){print $1; $found++}' file.txt

Ces options de ligne de commande sont utilisées :

  • -n boucle autour de chaque ligne du fichier d'entrée
  • -l supprime les retours à la ligne avant le traitement, et les réintroduit après.
  • -e exécuter le code perl

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X