Wie andere bereits betont haben, grep
ist dies nicht das beste Werkzeug. Wenn Sie darauf bestehen, es zu verwenden, und wenn Sie das grep
unterstü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 \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.
/etc/passwd
sein kann oder auch nicht , wo alle Benutzer sind. Betrachten Sie auchgetent passwd
.