Quelles commandes puis-je utiliser pour afficher tous les utilisateurs ayant un identifiant (UID) supérieur à 10?
Vous pouvez analyser la base de données passwd
à l’aide de awk
. Au format passwd
, chaque entrée est une liste de champs délimités par :
, le premier étant le nom d'utilisateur et le troisième étant l'UID. Donc, dans awk, vous pourriez faire:
getent passwd | awk -F: '$3 > 10 {print $1}'
SOLUTION 1:
Vous pouvez utiliser:
#!/bin/bash
while IFS= read -r line; do
[[ "$(cut -d: -f3 <<<"$line")" -gt 10 ]] && echo "$line"
done </etc/passwd
Considérant que vous n'avez pas de nom d'utilisateur contenant :
.
Si vous voulez juste les noms d'utilisateur:
#!/bin/bash
while IFS= read -r line; do
[[ "$(cut -d: -f3 <<<"$line")" -gt 10 ]] && echo "$(cut -d: -f1 <<<"$line")"
done </etc/passwd
Nous lisons ici chaque ligne du fichier /etc/passwd
et comparons le troisième champ délimité par :
(UID) pour vérifier s’il est supérieur à 10. Si c’est vrai, nous avons imprimé la ligne (ou nom d'utilisateur dans le second script).
Ce serait beaucoup plus simple en utilisant un tableau (grâce à muru):
#!/bin/bash
while IFS=: read -a line; do
[[ "${line[2]}" -gt 10 ]] && echo "${line[0]}"
done </etc/passwd
SOLUTION 2:
Utilisation de grep
avec PCRE:
getent passwd | grep -P '^[^:]+:[^:]+:(?!(?:\d|10):)' | cut -d: -f1
^[^:]+:
correspondra au premier champ (nom d'utilisateur), y compris la fin :
[^:]+:
correspondra au deuxième champ (mot de passe), y compris la fin :
La partie (?!(?:\d|10):)
est délicate, il s’agit d’un motif de type PCRE (grep -P
), de largeur négative, il signifie qu’il n’ya pas de chiffre unique (\d
) ni le numéro 10 suivant, suivi d’un :
.
cut -d: -f1
imprimera simplement le premier champ (nom d'utilisateur).
Alternativement, vous pouvez éviter le cut
, en utilisant le signe d'anticipation négatif (?!)
à l'intérieur du motif d'anticipation positif (?=)
(grâce à Avinash Raj):
getent passwd | grep -Po '^[^:]+(?=:[^:]+:(?!(?:\d|10):))'
SOLUTION 3:
en utilisant python
:
#!/usr/bin/env python2
with open('/etc/passwd') as f:
print '\n'.join([line.split(':')[0] for line in f if int(line.split(':')[2]) > 10])
Ici, nous imprimons les noms d'utilisateur si le troisième champ est supérieur à 10. line.split(':')
divisera les champs de chaque ligne sur :
, ce qui en fera une liste de champs.
Utilisation de awk:
awk -F: '{if ($3 > 10) { print $1 ":" $3 } }' /etc/passwd
cela listera tous les utilisateurs avec leur UID associé où UID> 10.
Merci à @sadi note de ne lister que les noms d'utilisateurs
awk -F: '{if ($3 > 10) {print $1}}' /etc/passwd