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 ?

1voto

mightypile Points 316

Vous pouvez utiliser grep, comme l'indiquent les autres réponses. Mais vous n'avez pas besoin de grep, awk, sed, perl, cut, ou tout autre outil externe. Vous pouvez le faire avec du bash pur.

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 plus longue correspondance de " : " dans $line.

$ 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, %% dit à bash de supprimer la plus longue correspondance de " : " dans $line à partir de la fin.

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

La sous-chaîne à séparer est ":\" car le caractère espace doit être échappé par la barre oblique inverse.

Vous trouverez d'autres exemples de ce type sur le site le projet de documentation linux .

1voto

ceving Points 3990

Le BASH moderne prend en charge les expressions régulières :

while read -r line; do
  if [[ $line =~ ^potato:\ ([0-9]+) ]]; then
    echo "${BASH_REMATCH[1]}"
  fi
done

-3voto

grep potato file | grep -o "[0-9].*"

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