我需要使用 grep 從 /etc/passwd 尋找列出的所有使用者主目錄

我需要使用 grep 從 /etc/passwd 尋找列出的所有使用者主目錄

我有一個與該網站上的另一個問題類似的問題,該人必須從 /etc/passwd 中使用 grep 或 awk 找到所有用戶的清單。這對我有用,但我嘗試翻譯它以查找並列出它們的主目錄。我已經知道你不能用一行來完成它,所以我知道我會使用管道。我已經在網上完成了研究,但我無法弄清楚問題所在。如果我使用 grep 並執行以下操作:

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

……它可能會給我一個錯誤,或者它還會向我顯示 /bin/bash 文件,這不是我想要的。我只需要使用 grep 列出的使用者名稱及其主目錄!我也不確定 * 是否會將其他正斜線顯示為字符,因為某些主目錄不僅僅有兩個 /(正斜線)。

答案1

您可以使用cut使用特定分隔符號上的列分割檔案:

cut -d: -f6 /etc/passwd

-f1,6對於第 1 列和第 6 列(欄位)。

答案2

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}'– 表示以指定格式列印第一列和第六列。

  • /etc/passwd– 是我們正在處理的文件

答案3

正如其他人指出的那樣,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

解釋

正規表示式有兩個部分,它找出^[^:]+OR (這就是意思|.*:\K[^:]+(?=:[^:]+)。第一個:從行的開頭找一個或多個非字元。這與用戶名匹配。第二部分找出盡可能多的字符,直到:( .*:),然後丟棄它們(這就是它\K所做的),因此它們不會被列印。然後它匹配一個字串 non- :,後面跟著:and non- :。此(?=foo)構造稱為正向的前瞻並且是一種匹配字符的方式不包含匹配本身中的這些字元的模式。

如果目前行號 ( ) 能被 2 整除,則該perl指令將用 和 空格替換換行符。:$.

答案4

我相信您可以透過「cut」來做到這一點,僅使用一個二進位文件,避免管道,達到與其他答案相同的結果,但以一種更優雅的方式:),如下所示:

$ 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

相關內容