他の人が指摘したように、これgrepはこれに最適なツールではありません。あなたがそれを使用することを主張し、あなたがgrepサポートしている場合-o(行の一致した部分のみを印刷する)と-P(Perl互換の正規表現を使用する)、これを行うことができます:
$ grep -oP '^[^:]+|.*:\K[^:]+(?=:[^:]+)' /etc/password
terdon
/home/terdon
bob
/home/bob
これにより、システムユーザーを含むすべてのユーザーが印刷されることに注意してください。例として4行しか表示していません。
これにより、すべてのユーザーのユーザー名とホームディレクトリが別々の行に出力されます。次に、ラインの各ペアを結合してそれらを組み合わせる必要があります。
$ 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
説明
正規表現には2つの部分があり、^[^:]+OR(つまり、|意味)を探し.*:\K[^:]+(?=:[^:]+)ます。最初:の行は、行の先頭から1つ以上の非文字を探します。これはユーザー名と一致します。2番目の部分は、:(.*:)まで可能な限り多くの文字を探し、それらを破棄して(それがの処理\Kです)、印刷されません。次に、non- :とそれに続く:andのストリングに一致します:。(?=foo)構築物と呼ばれ、正の先読みと文字のマッチングの方法である後に試合自体にそれらの文字を含まないパターン。
perlコマンドがで改行を置換する:現在の行番号(あればスペース$.)2.だから、2行ごとで割り切れます。
/etc/passwdすべてのユーザーがいる場所である場合とそうでない場合があります。も検討してくださいgetent passwd。