![我需要使用 grep 從 /etc/passwd 尋找列出的所有使用者主目錄](https://rvso.com/image/89172/%E6%88%91%E9%9C%80%E8%A6%81%E4%BD%BF%E7%94%A8%20grep%20%E5%BE%9E%20%2Fetc%2Fpasswd%20%E5%B0%8B%E6%89%BE%E5%88%97%E5%87%BA%E7%9A%84%E6%89%80%E6%9C%89%E4%BD%BF%E7%94%A8%E8%80%85%E4%B8%BB%E7%9B%AE%E9%8C%84.png)
我有一個與該網站上的另一個問題類似的問題,該人必須從 /etc/passwd 中使用 grep 或 awk 找到所有用戶的清單。這對我有用,但我嘗試翻譯它以查找並列出它們的主目錄。我已經知道你不能用一行來完成它,所以我知道我會使用管道。我已經在網上完成了研究,但我無法弄清楚問題所在。如果我使用 grep 並執行以下操作:
grep -oE '^[/*/]$' /etc/passwd
……它可能會給我一個錯誤,或者它還會向我顯示 /bin/bash 文件,這不是我想要的。我只需要使用 grep 列出的使用者名稱及其主目錄!我也不確定 * 是否會將其他正斜線顯示為字符,因為某些主目錄不僅僅有兩個 /(正斜線)。
答案1
答案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