É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?
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
Ou utilisez des assertions regex: grep -oP '(?<=potato: ).*' file.txt
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.
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 PerlVous 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 .