Ich habe eine ähnliche Frage wie eine andere auf dieser Site, bei der die Person eine Liste aller Benutzer finden musste, die grep oder awk aus / etc / passwd verwenden. Das hat bei mir funktioniert, aber ich habe versucht, es zu übersetzen, um auch die Home-Verzeichnisse zu finden und aufzulisten. Ich weiß bereits, dass Sie es nicht in einer Zeile tun können, also weiß ich, dass ich eine Pipeline verwenden würde. Ich habe online recherchiert, kann es aber nicht herausfinden. Wenn ich grep benutze und so etwas mache:
grep -oE '^[/*/]$' /etc/passwd
... es würde mir wahrscheinlich einen Fehler geben oder es wird mir auch die / bin / bash-Dateien zeigen, was nicht das ist, was ich will. Ich brauche nur die Benutzernamen und ihre Home-Verzeichnisse, die mit grep aufgelistet sind! Ich bin mir auch nicht sicher, ob das * andere Schrägstriche als Zeichen anzeigt, da einige Home-Verzeichnisse mehr als nur zwei / 's (Schrägstriche) haben.
quelle
/etc/passwd
sein kann oder auch nicht , wo alle Benutzer sind. Betrachten Sie auchgetent passwd
.Antworten:
Grep ist wirklich nicht das Werkzeug, um Daten auf diese Weise zu analysieren, grep ist eher für den Mustervergleich und Sie versuchen, Text zu verarbeiten. Sie möchten awk verwenden.
awk
Der Befehl-F":"
Setzt den Datenbegrenzer auf:$7 == "/bin/false"
Überprüft, ob die 7. Datenspalte / bin / false ist{print "User: "$1 "Home Dir: "$6}'
Sagt, die erste Spalte und die sechste Spalte im angegebenen Format zu drucken./etc/passwd
Ist die Datei, die wir verarbeitenquelle
grep -oE '^[^:]+' /etc/passwd
Das gibt mir nur die Benutzer, die ich brauche, um so etwas oder ähnliches zu piplinieren, um die Home-Verzeichnisse dort bei sich zu habenSie können
cut
Dateien mit Spalten in einem bestimmten Trennzeichen teilen:Oder
-f1,6
für die Spalten (Felder) 1 und 6.quelle
Wie andere bereits betont haben,
grep
ist dies nicht das beste Werkzeug. Wenn Sie darauf bestehen, es zu verwenden, und wenn Sie dasgrep
unterstützen-o
(nur den übereinstimmenden Teil der Zeile drucken) und-P
(Perl-kompatible reguläre Ausdrücke verwenden), können Sie dies tun:Beachten Sie, dass dadurch alle Benutzer, einschließlich Systembenutzer, gedruckt werden. Ich zeige nur 4 Zeilen als Beispiel.
Dadurch werden der Benutzername und die Home-Verzeichnisse aller Benutzer gedruckt, jedoch in separaten Zeilen. Sie müssen dann jedes Zeilenpaar verbinden, um sie zusammenzufügen:
Erläuterung
Die Regex besteht aus zwei Teilen, sie sucht nach
^[^:]+
ODER (das ist was das|
bedeutet).*:\K[^:]+(?=:[^:]+)
. Der erste sucht:
am Anfang der Zeile nach einem oder mehreren Nicht- Zeichen. Dies entspricht dem Benutzernamen. Der zweite Teil sucht nach so vielen Zeichen wie möglich bis a:
(.*:
) und verwirft sie dann (das ist, was der\K
tut), damit sie nicht gedruckt werden. Es stimmt dann mit einer Zeichenfolge von non- überein,:
gefolgt von:
und non-:
. Das(?=foo)
Konstrukt wird als positiver Lookahead bezeichnet und ist eine Möglichkeit, die Zeichen nach einem Muster abzugleichen, ohne diese Zeichen in die Übereinstimmung selbst einzubeziehen.Der
perl
Befehl ersetzt Zeilenumbrüche durch:
Leerzeichen und Leerzeichen, wenn die aktuelle Zeilennummer ($.
) durch 2 teilbar ist. Also jede zweite Zeile.quelle
perl -naf: -e 'print $F[0]." : ".$F[5].$/'
dahersed 'N;s/\n/ : /'
möglicherweise ein besserer Partner fürgrep -oP
.Ich glaube, dass Sie dies mit "cut" tun können, indem Sie nur eine Binärdatei verwenden, Pipes vermeiden und die gleichen Ergebnisse wie die anderen Antworten erzielen, aber auf elegantere Weise :), wie folgt:
Wenn Sie eine Ausgabe haben möchten, die besser formatiert und alphabetisch sortiert ist, müssen Sie hier mehr Binärdateien verwenden:
quelle