J'ai une question similaire à une autre sur ce site où l'individu devait trouver une liste de tous les utilisateurs utilisant grep ou awk depuis / etc / passwd. Cela a fonctionné pour moi, mais j'ai essayé de le traduire pour trouver et répertorier leurs répertoires personnels également. Je sais déjà que vous ne pouvez pas le faire en une seule ligne, donc je sais que j'utiliserais un pipeline. J'ai fait mes recherches en ligne mais je ne peux pas comprendre le problème. Si j'utilise grep et fais quelque chose comme ceci:
grep -oE '^[/*/]$' /etc/passwd
... cela me donnerait probablement une erreur ou il me montrerait également les fichiers / bin / bash qui ne sont pas ce que je veux. J'ai juste besoin des noms d'utilisateur et de leurs répertoires personnels répertoriés à l'aide de grep! Je ne sais pas non plus si le * affichera d'autres barres obliques en tant que caractères, car certains répertoires personnels ont plus de deux / (barres obliques).
la source
/etc/passwd
peut ou non être où tous les utilisateurs sont. Pensez aussigetent passwd
.Réponses:
Grep n'est vraiment pas l'outil pour analyser les données de cette façon, grep est plus pour la correspondance de motifs et vous essayez de faire du traitement de texte. Vous voudriez utiliser awk.
awk
La commande-F":"
Définit le délimiteur de données sur:$7 == "/bin/false"
Vérifie si la 7e colonne de données est / bin / false{print "User: "$1 "Home Dir: "$6}'
Dit d'imprimer la première colonne et la sixième colonne dans le format spécifié./etc/passwd
Est le fichier que nous traitonsla source
grep -oE '^[^:]+' /etc/passwd
cela me donne juste les utilisateurs dont j'ai besoin pour établir quelque chose comme ça ou quelque chose de similaire pour avoir les répertoires personnels avec euxVous pouvez utiliser
cut
pour fractionner des fichiers avec des colonnes sur un délimiteur spécifique:Ou
-f1,6
pour les colonnes (champs) 1 et 6.la source
Comme d'autres l'ont souligné, ce
grep
n'est pas le meilleur outil pour cela. Si vous insistez pour l'utiliser, et si votregrep
prend en charge-o
(n'imprime que la partie correspondante de la ligne) et-P
(utilisez des expressions régulières compatibles Perl), vous pouvez le faire:Notez que cela imprimera tous les utilisateurs, y compris les utilisateurs du système. Je ne montre que 4 lignes à titre d'exemple.
Cela affichera le nom d'utilisateur et les répertoires personnels de tous les utilisateurs, mais sur des lignes distinctes. Vous devez ensuite joindre chaque paire de lignes pour les réunir:
Explication
Le regex a deux parties, il cherche
^[^:]+
OU (c'est ce que le|
moyen).*:\K[^:]+(?=:[^:]+)
. Le premier recherche un ou plusieurs:
caractères non depuis le début de la ligne. Cela correspond au nom d'utilisateur. La deuxième partie recherche autant de caractères que possible jusqu'à a:
(.*:
) puis les supprime (c'est ce que\K
fait le) pour qu'ils ne soient pas imprimés. Il correspond alors à une chaîne de non:
qui est suivie de:
et de non:
. La(?=foo)
construction est appelée une anticipation positive et est un moyen de faire correspondre les caractères après un modèle sans inclure ces caractères dans la correspondance elle-même.La
perl
commande remplacera les sauts de ligne par:
et les espaces si le numéro de ligne actuel ($.
) est divisible par 2. Donc, toutes les deux lignes.la source
perl -naf: -e 'print $F[0]." : ".$F[5].$/'
doncsed 'N;s/\n/ : /'
pourrait être un meilleur partenaire pourgrep -oP
.Je crois que vous pouvez le faire avec "cut", en utilisant un seul binaire, en évitant les tuyaux, en atteignant les mêmes résultats que les autres réponses, mais de manière plus élégante :), comme ceci:
Si vous voulez avoir une sortie mieux formatée + ordre alphabétique, voici, mais le compromis est que vous devez utiliser plus de binaires:
la source