"Cutting" id sortie

C'est un problème assez simple:

J'ai besoin d'écrire un script qui "couperait" la sortie de la command id en trois parties. Par exemple:

Disons que id donne cette sortie: uid=12345(mylogin) gid=100(users)

Et mon script devrait le sortir comme ceci:

 Login: mylogin Id: 12345 Group: users 

Pourriez-vous m'aider avec le script?

Utilisation d'un séparateur de champs à plusieurs caractères dans awk

 $ echo 'uid=12345(mylogin) gid=100(users)' | awk -F'[=()]' '{print "Login: " $3 "\nId: " $2 "\nGroup: " $6}' Login: mylogin Id: 12345 Group: users 
  • -F'[=()]' set = ou ( ou ) comme séparateurs de champs
  • $3 sera le troisième champ, après le premier = et le premier ( terminé par ) . Donc, il obtient la valeur mylogin
  • De même pour les autres champs et imprimer au besoin

Ne vous embêtez pas à essayer de l'parsingr. POSIX exige que l' id supporte diverses options pour le faire automatiquement:

 printf "Login: %s\nId: %s\nGroup: %s\n" "$(id -un)" "$(id -u)" "$(id -gn)" 

En plus d'être plus de travail, l'parsing syntaxique est compliquée par le fait que l' id sans options est autorisé à produire une sortie dépendant des parameters régionaux:

Les formats suivants doivent être utilisés lorsque la catégorie locale LC_MESSAGES spécifie les parameters régionaux POSIX. Dans d'autres locales, les strings uid, gid, euid, egid et groups peuvent être remplacées par des strings plus appropriées correspondant aux parameters régionaux.

Bien que la plupart des outils d'parsing raisonnables puissent y faire face, tout ce qui n'est pas compatible avec Unicode peut avoir des problèmes.

Une façon peut être:

 # 0 | 1 | 2 | 3 | 4 | 5 | #uid=12345(mylogin) gid=100(users) IFS='(=)' read -a A <<<"$(id)" printf '%s: %s\n' Login "${A[2]}" Id "${A[1]}" Group "${A[5]}" # remember array A indexing begins at 0. 

Littéralement, en utilisant seulement la cut :

 echo Login: $(id | cut -d ' ' -f1 | cut -d= -f2 | cut -d '(' -f1) echo Id: $(id | cut -d ' ' -f1 | cut -d= -f2 | cut -d '(' -f2 | cut -d ')' -f1) echo Group: $(id | cut -d ' ' -f2 | cut -d '(' -f2 | cut -d ')' -f1)