Sans awk ?...Mais c'est tellement simple avec awk :
echo 'maps.google.com' | awk -F. '{print $NF}'
AWK est un outil beaucoup plus puissant à avoir dans votre poche.-F si pour séparateur de champNF est le nombre de champs (représente également l'index du dernier)
Vous pouvez essayer quelque chose comme ceci :
echo 'maps.google.com' | rev | cut -d'.' -f 1 | rev
Explication
rev
inverse "maps.google.com" pour êtremoc.elgoog.spam
cut
utilise le point (c'est-à-dire '.') comme délimiteur et choisit le premier champ, qui estmoc
- enfin, nous l'inversons à nouveau pour obtenir
com
Il n'est pas possible d'utiliser uniquement cut
. Voici un moyen d'utiliser grep
:
grep -o '[^,]*$'
Remplacez la virgule pour les autres délimiteurs.
Explication :
-o
(--only-matching
) ne produit que la partie de l'entrée qui correspond au modèle (la valeur par défaut est d'imprimer la ligne entière si elle contient une correspondance).[^,]
est une classe de caractères qui correspond à tout caractère autre qu'une virgule.*
correspond au modèle précédent zéro fois ou plus, donc[^,]*
correspond à zéro ou plusieurs caractères autres que des virgules.$
correspond à la fin de la chaîne.- En mettant cela ensemble, le modèle correspond à zéro ou plusieurs caractères autres que des virgules à la fin de la chaîne.
- Lorsqu'il y a plusieurs correspondances possibles,
grep
préfère celui qui commence le plus tôt. Ainsi, tout le dernier champ sera mis en correspondance.
Exemple complet :
Si nous avons un fichier appelé data.csv contenant
one,two,three
foo,bar
puis grep -o '[^,]*$' < data.csv
sortira
three
bar
Utilisez une extension de paramètre. C'est beaucoup plus efficace que n'importe quel type de commande externe, cut
(ou grep
) inclus.
data=foo,bar,baz,qux
last=${data##*,}
Voir BashFAQ #100 pour une introduction à la manipulation de chaîne native dans bash.