web-dev-qa-db-fra.com

Comment grep pour le contenu après le motif?

Étant donné un fichier, par exemple:

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

Je voudrais grep pour toutes les lignes commençant par potato: mais uniquement les numéros qui suivent potato:. Ainsi, dans l'exemple ci-dessus, le résultat serait:

1234
5432

Comment puis je faire ça?

65
Lexicon
grep 'potato:' file.txt | sed 's/^.*: //'

ou

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

ou

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

ou

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

ou

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

ou

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

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

54
mohit6up
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 quoi vous voulez - bien sûr, il existe plusieurs autres moyens raisonnables de le faire.

9
thb

Cela imprimera tout après chaque match, sur cette même ligne uniquement:

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

Cela fera la même chose, sauf que toutes les lignes suivantes seront également imprimées:

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 nouvelles lignes avant le traitement et les rajoute ensuite
  • -e exécuter le code Perl
2
Chris Koknat

Vous pouvez utiliser grep, comme l'indique l'autre réponse. Mais vous n'avez pas besoin de grep, awk, sed, Perl, cut ou de tout outil externe. Vous pouvez le faire avec pure bash.

Essayez ceci (les points-virgules sont là pour vous permettre de tout mettre sur une seule ligne):

$ while read line;
  do
    if [[ "${line%%:\ *}" == "potato" ]];
    then
      echo ${line##*:\ };
    fi;
  done< file.txt

## indique à bash de supprimer la correspondance la plus longue de ":" dans $ line depuis le début.

$ while read line; do echo ${line##*:\ }; done< file.txt
1234
5678
5432
4567
5432
56789

ou si vous voulez la clé plutôt que la valeur, %% indique à bash de supprimer la correspondance la plus longue de ":" dans la ligne $ de la fin.

$ while read line; do echo ${line%%:\ *}; done< file.txt
potato
Apple
potato
grape
banana
sushi

La sous-chaîne sur laquelle se scinder est ": \" car le caractère espace doit être échappé avec la barre oblique inverse.

Vous pouvez trouver plus comme ceux-ci sur le projet de documentation linux .

1
mightypile