Réponses:
En supposant que ce que vous voulez réellement dire, c'est que vous voulez tout supprimer jusqu'au dernier colon et laisser john.doe
intact:
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' |
sed 's/.*://'
La première ligne dirige simplement la chaîne de test à sed
des fins d'exemple.
Le second est une sed
substitution de base . La partie entre le premier et le second /
est l'expression rationnelle à rechercher et la partie entre le deuxième et le troisième est ce par quoi le remplacer (rien dans ce cas car nous supprimons).
Pour l'expression régulière, .
correspond à n'importe quel caractère, le *
répète autant de fois (y compris zéro) et :
correspond à deux points. Si efficacement, c'est tout ce qui est suivi d'un côlon. Puisque .*
peut inclure un deux-points, la correspondance est «gourmande» et tout jusqu'au dernier deux-points est inclus.
sed -r 's/:/\t/g' filename | awk -F'\t' '{print $4}'
Je remplace toutes les occurrences de : par un onglet puis j'utilise awk
pour extraire la chaîne john.doe.
Si vous n'avez pas de fichier, vous pouvez essayer ceci.
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' |
awk -F'\t' '{print $4}'
Selon les commentaires de Graeme, nous pouvons utiliser awk
pour imprimer la dernière colonne seule en utilisant la NF
variable de awk
comme ci-dessous.
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | awk -F'\t' '{print $NF}'
Incorporer les commentaires de Graeme pour se débarrasser des inutiles sed
La commande peut être modifiée comme ci-dessous.
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | awk -F':' '{print $NF}'
awk
. Fondamentalement, j'essaie de tester les commandes que j'ai initialement reçues dans ma réponse et d'essayer de les modifier en fonction des besoins de l'utilisateur. :)
-F
option pour awk
spécifie le séparateur de champ. Si vous dites awk
d'utiliser un deux-points, il n'est pas nécessaire de remplacer les deux-points par des tabulations. De plus, si vous souhaitez obtenir le dernier champ que vous pouvez utiliser à la $NF
place $4
, cela fonctionnera alors s'il n'y a pas toujours 3 deux-points.
Une autre méthode utilisant awk
:
awk -F: '{ print $NF }'
S'il vous plaît essayez
modifier: ancre supprimée
echo 'abc:fjk' |sed 's/.*:/john.doe/g'
et supprimer
echo 'abc:fjk' |sed 's/.*://g'
^
ancre ne fait aucune différence dans le cas de la question ou dans votre cas d'exemple. Toute adresse commençant par commence /.*
déjà par le ^
.
awk
, pourquoi ne pas simplement le faireawk -F:
?