/ etc / passwdのgrepを使用してリストされているすべてのユーザーのホームディレクトリを見つける必要があります


8

このサイトの別の質問と同様の質問があります。個人が/ etc / passwdからgrepまたはawkを使用してすべてのユーザーのリストを見つける必要がありました。それは私にとってはうまくいきましたが、私はそれを翻訳してそれらのホームディレクトリも見つけてリストすることを試みました。私はあなたが一行でそれを行うことができないことをすでに知っているので、私はパイプラインを使用することを知っています。私はオンラインで調査を行いましたが、問題を理解できません。grepを使用して、次のようなことをした場合:

   grep -oE '^[/*/]$' /etc/passwd 

...おそらくエラーになるか、または/ bin / bashファイルも表示されますが、これは私が望んでいるものではありません。ユーザー名とそのホームディレクトリがgrepを使用してリストされているだけです。一部のホームディレクトリには2つ以上の/(スラッシュ)があるため、*が他のスラッシュを文字として表示するかどうかもわかりません。


3
また、/etc/passwdすべてのユーザーがいる場所である場合とそうでない場合があります。も検討してくださいgetent passwd
2016年

回答:


10

Grepは、この方法でデータを解析するためのツールではありません。grepは、パターンマッチングのためのツールであり、テキスト処理を試みています。あなたはawkを使いたいでしょう。

awk -F":" '$7 == "/bin/false" {print "User: "$1 "Home Dir: "$6}' /etc/passwd

awk コマンド

-F":" データ区切り文字を次のように設定します。

$7 == "/bin/false" 7番目のデータ列が/ bin / falseかどうかを確認します

{print "User: "$1 "Home Dir: "$6}' 最初の列と6番目の列を指定された形式で印刷するとします。

/etc/passwd 処理しているファイルです


私はawkがあまり好きではありません。-F:と '{print $ 1 "" $ 6}'が正確に何をするか説明できますか?
NarinderRSharma

私はあなたの質問に答えるために私の答えを更新しました
ザカリーブレイディ

ええ、私がそれを実行すると、パスワードの暗号化、UID GID、使用しているシェルのタイプが表示されます。ユーザーを印刷するためだけに必要であり、ユーザーはホームディレクトリにすぎません。もちろん、grepまたはawkを使用します。
NarinderRSharma

私が次を使用するとき:grep -oE '^[^:]+' /etc/passwdそれは私に、ホームディレクトリをそこに持つためにそのようなものまたは類似のものをpiplineする必要があるユーザーのみを提供します
NarinderRSharma

1
etc passwdからサンプルの(難読化された)行を表示できますか?区切られているように聞こえません:区切られているか、区切られている場合、通常のレイアウトではありません。
ザカリーブレイディ

18

を使用cutして、特定の区切り文字の列を持つファイルを分割できます。

cut -d: -f6 /etc/passwd

または-f1,6、列(フィールド)1および6の場合。


4
1つの仕事をしてそれをうまく行うシンプルなツール。一を足す!
fd0 2016年

1

他の人が指摘したように、これ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行ごとで割り切れます。


perlは 'awk-mode'ですべての仕事を行うperl -naf: -e 'print $F[0]." : ".$F[5].$/'ことsed 'N;s/\n/ : /'ができるので、のより良いパートナーかもしれませんgrep -oP
dave_thompson_085

0

私はこれを「カット」で実行でき、1つのバイナリのみを使用して、パイプを避け、他の回答と同じ結果に到達しますが、次のように、よりエレガントな方法で:)できます。

$ 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
....

出力をより適切にフォーマットしたい+アルファベット順が欲しい場合はここにありますが、トレードオフはそれであり、より多くのバイナリを使用する必要があります:

$ 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.