Ich muss alle Benutzerverzeichnisse finden, die mit grep aus / etc / passwd aufgelistet sind

8

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.

NarinderRSharma
quelle
3
Auch /etc/passwdsein kann oder auch nicht , wo alle Benutzer sind. Betrachten Sie auch getent passwd.
Thrig

Antworten:

10

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 -F":" '$7 == "/bin/false" {print "User: "$1 "Home Dir: "$6}' /etc/passwd

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 verarbeiten

Zachary Brady
quelle
Ich mag awk nicht besonders gern. Können Sie erklären, was die -F: und '{print $ 1 "" $ 6}' genau tun?
NarinderRSharma
Ich habe meine Antwort aktualisiert, um Ihre Frage zu beantworten
Zachary Brady
Ja, sehen Sie für mich, wenn ich das tue, zeigt es mir immer noch die Passwortverschlüsselungen, UID GIDS, welche Art von Shell wir verwenden. Ich brauche es, um nur die Benutzer zu drucken und sie sind Home-Verzeichnisse, sonst nichts. natürlich mit grep oder awk.
NarinderRSharma
Wenn ich Folgendes verwende: grep -oE '^[^:]+' /etc/passwdDas gibt mir nur die Benutzer, die ich brauche, um so etwas oder ähnliches zu piplinieren, um die Home-Verzeichnisse dort bei sich zu haben
NarinderRSharma
1
Können wir eine Beispielzeile (verschleiert) von Ihrem etc passwd sehen? Es hört sich nicht so an, als wäre es: abgegrenzt oder wenn es so ist, ist es nicht normal angelegt.
Zachary Brady
18

Sie können cutDateien mit Spalten in einem bestimmten Trennzeichen teilen:

cut -d: -f6 /etc/passwd

Oder -f1,6für die Spalten (Felder) 1 und 6.

Stefano Palazzo
quelle
4
Einfache Werkzeuge, die einen Job machen und es gut machen. Plus eins!
fd0
1

Wie andere bereits betont haben, grepist dies nicht das beste Werkzeug. Wenn Sie darauf bestehen, es zu verwenden, und wenn Sie das grepunterstützen -o(nur den übereinstimmenden Teil der Zeile drucken) und -P(Perl-kompatible reguläre Ausdrücke verwenden), können Sie dies tun:

$ grep -oP '^[^:]+|.*:\K[^:]+(?=:[^:]+)' /etc/password
terdon
/home/terdon
bob
/home/bob

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:

$ grep -oP '^[^:]+|.*:\K[^:]+(?=:[^:]+)' /etc/passwd | perl -pe 's/\n/ : / if $.%2'
root : /root
bin : /bin
daemon : /
mail : /var/spool/mail
ftp : /srv/ftp
http : /srv/http
uuidd : /
dbus : /
nobody : /
systemd-journal-gateway : /
systemd-timesync : /
systemd-network : /
systemd-bus-proxy : /
systemd-resolve : /
systemd-journal-upload : /
systemd-coredump : /
systemd-journal-remote : /
terdon : /home/terdon
avahi : /
polkitd : /
colord : /var/lib/colord
rtkit : /proc
gdm : /var/lib/gdm
git : /
bob : /home/bob

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 \Ktut), 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 perlBefehl ersetzt Zeilenumbrüche durch :Leerzeichen und Leerzeichen, wenn die aktuelle Zeilennummer ( $.) durch 2 teilbar ist. Also jede zweite Zeile.

terdon
quelle
Perl kann den ganzen Job mit 'awk-mode' erledigen und ist perl -naf: -e 'print $F[0]." : ".$F[5].$/'daher sed 'N;s/\n/ : /'möglicherweise ein besserer Partner für grep -oP.
Dave_thompson_085
0

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:

$ cut -d : -f 1,6 /etc/passwd

root:/root
daemon:/usr/sbin
bin:/bin
sys:/dev
sync:/bin
games:/usr/games
man:/var/cache/man
lp:/var/spool/lpd
mail:/var/mail
news:/var/spool/news
....

Wenn Sie eine Ausgabe haben möchten, die besser formatiert und alphabetisch sortiert ist, müssen Sie hier mehr Binärdateien verwenden:

$ cut -d : -f 1,6 /etc/passwd | sort | column

avahi-autoipd:/var/lib/avahi-autoipd        man:/var/cache/man
avahi:/var/run/avahi-daemon                 messagebus:/var/run/dbus
backup:/var/backups                         news:/var/spool/news
bin:/bin                                    nobody:/nonexistent
clickpkg:/nonexistent                       ntp:/home/ntp
colord:/var/lib/colord                      proxy:/bin
daemon:/usr/sbin                            pulse:/var/run/pulse
dnsmasq:/var/lib/misc                       root:/root
games:/usr/games                            rtkit:/proc
gnats:/var/lib/gnats                        saned:/home/saned
hplip:/var/run/hplip                        speech-dispatcher:/var/run/speech-dispatcher
irc:/var/run/ircd                           sync:/bin
ivanleon:/home/ivanleon                     sys:/dev
kernoops:/                                  syslog:/home/syslog
libuuid:/var/lib/libuuid                    usbmux:/home/usbmux
lightdm:/var/lib/lightdm                    usermetrics:/var/lib/usermetrics
list:/var/list                              uucp:/var/spool/uucp
lp:/var/spool/lpd                           whoopsie:/nonexistent
lxc-dnsmasq:/var/lib/lxc                    www-data:/var/www
mail:/var/mail
ivanleoncz
quelle