2012-03-02 74 views
2

我試圖找出我/ etc/passwd中具有用戶標識爲0的所有用戶。它應該顯示用戶名以及用戶名, ID。我嘗試了以下方法:在/ etc/passwd文件中識別具有重複用戶標識的用戶名

awk -F: '{ 
count[$3]++;}END { 
for (i in count) 
    print i, count[i]; 
}' passwd 

它給出了重複的user-ids和它們發生的次數。其實我是想用戶名也隨之重複的用戶ID類似像

如果解決方案提供使用awk asscociative陣列
zama  0 
root  0 
bin  100 
nologin 100 

將是巨大的。其他方法也很好。

回答

2

這是做你想做的嗎?

awk -F: '{ 
count[$3]++; names[$3 "," count[$3]] = $1}END { 
for (i in count) { 
    for (j = 1; j <= count[i]; j++) { 
    print names[i "," j], i, count[i]; 
    } 
} 
}' passwd 
+0

感謝回答。我早些時候嘗試了上面的例子,它給出了用戶名,但是我希望所有用戶名在第3列中都有重複的user-id。它現在只顯示與用戶標識3相對應的唯一用戶名。 – 2012-03-02 06:29:54

+1

獲得*所有*用戶名,連接遇到的值,如下所示: 'name [$ 3] = names [$ 3]「\ t」$ 1' – 2012-03-02 09:53:58

+0

Thanks Nik。它的工作 – 2012-03-02 10:10:17

1

這可能會爲你工作:

awk -F: '$3~/0/{if($3 in a){d[$3];a[$3]=a[$3]"\n"$3" "$1}else{a[$3]=$3" "$1}};END{for(x in d)print a[x]}' /etc/passwd 

或這種非awk的解決方案:

cut -d: -f1,3 /etc/passwd | 
sort -st: -k2,2n | 
tr ':' ' ' | 
uniq -Df1 | 
sed 's/\(.*\) \(.*\)/\2 \1/p;d' 
+0

Hi Potong,非awk解決方案看起來很棒。但是,請你解釋一下sed聲明它是如何工作的。對我來說有點複雜。並且,很抱歉在這裏遲到回來 – 2012-03-13 07:35:09

+0

哎呀!我留下了一些調試命令。我現在已經刪除了它。基本上所有的sed語句都會顛倒前兩個(實際上只有兩個)字段,以便used-id在用戶名之前。 – potong 2012-03-13 09:02:08

-1
myid=`cat passwd|awk -F: '{print $3 }'| sort | uniq -d` 
for i in `echo "$myid"`;do 
    egrep "^.*:x:$i" passwd | awk -F: '{print $1 , $3}' 
done 
+0

這是在反引號中一個英俊無用的'echo'。 http://partmaps.org/era/unix/award.html#backticks – tripleee 2013-04-26 20:11:41