2012-09-04 118 views
2

/etc/passwd,我只需要「用戶」部分。使用shell腳本從passwd文件獲取用戶名

實施例:

backup:x:34:34:backup:/var/backups:/bin/sh 

具有backup作爲用戶。

要提取我現在用的這個用戶部分:

perl -pe 's/^(.*?):.*/\1/g' < /etc/passwd 

這是比我老的方法少了幾個大字:

while read line; do echo ${line%%:*}; done < /etc/passwd 

,但它聽起來像一個矯枉過正。這是寫很多文字。

谷歌搜索給我:

awk -F ':' '{print $1}' < /etc/passwd 

這相當於,我想?是嗎?

cmp <(perl -pe 's/^(.*?):.*/\1/g' < /etc/passwd) <(awk -F ':' '{print $1}' < /etc/passwd) 

有沒有一個標準的UNIX工具來做到這一點或使用Perl更簡單的方法?或者cut

我是初學者。

順便說一句,我想我的手在Python作爲內容,但我吮吸它,可能有更好的方法來做到這一點在Python :(

python -c 'print "\n".join([u[:u.find(":")] for u in open("/etc/passwd")])' 

編輯:實際上,也許更喜歡本作的Python:

python -c 'print "\n".join([u.split(":")[0] for u in open("/etc/passwd")])' 

嗯...仍然非常詳細。

回答

6
perl -F: -lane 'print $F[0]' < /etc/passwd 

確實是或多或少的awk解決方案。 -a表示將每一行輸入分割成字段,-F:表示:是字段分隔符。 -l爲每一行輸入輸出一個換行符,因此您不必說print "$F[0]\n"

既然你請吧,cut解決方案更是直截了當:

cut -d: -f1 < /etc/passwd 

含義:各執:,輸出的第一個字段。

+0

媽媽咪呀,那個'切'單班輪只是真棒,男人。我做錯了一切! – Robottinosino

5

就我個人而言,我會使用awk解決方案。切工作,但我經常發現它不夠靈活。

awk -F: '{print $1}' /etc/passwd 

或更一般地使用getent passwd。這將查詢在​​中配置的所有用戶數據庫源,可能是遠程LDAP服務器(還有/etc/passwd)。

getent passwd | awk -F: '{print $1}' 

如果你想要一個僅bash的解決方案,你可以這樣做。這看起來很奇怪,但它不會調用任何外部命令。設置字段間分隔符$IFS告訴read要分割的字符。最後的重定向< /etc/passwd將在整個循環中生效。

while IFS=: read USER _; do 
    echo "$USER" 
done < /etc/passwd 

(設置$IFS這樣只會影響read命令一般情況下,你可以把變量賦值任何命令之前,他們將只能在該命令生效例如:。

$ FOO=foo 
$ echo $FOO 
foo 
$ FOO=bar true 
$ echo $FOO 
foo 

因此,沒有關於搞亂了$IFS後顧之憂)

+0

這個Bash版本不適用於我:( – Robottinosino

+0

@Robottinosino修正了,忘了把'IFS =:'。 –

+0

+1 TIMTOWTDI:'awk'{sub(/:.*/,「」)} 1'/ etc/passwd' – Steve

1

Perl提供一個內置在爲你做這個。getpwent

endpwent(); # reset to beginning of file in case some other code has read some entries already 
while (my ($username) = getpwent()) { 
    print "user: $username\n"; 
} 
endpwent(); 

getpwuid和getpwnam可用於查找特定的名稱或ID;所有三個獲取函數都會返回一行中所有標準字段的列表。

1

如果你需要的只是用戶名,'id'命令就足夠了,而且更簡單。

USER=`id -un` 

對於密碼文件條目的其他部分,我仍然使用上述選項之一。