2013-11-21 21 views
1

我需要創建一個在系統上運行進程的用戶標識列表,而不管它們是否已登錄。但是,我有問題顯示完整的用戶名,這裏是我的代碼:在bash中顯示系統進程的用戶標識

#!/bin/bash 

i=0 

top -n 1 | while read line 
do 
    if [ $i -ge 7 ] 
    then 
     check=$(echo $line | awk '{print $3}') 
     if [ $check != "root" ] 
     then 
      user=$(echo $line | awk '{print $2}') 
      echo $user 
     fi 
    fi 

    i=$((i+1)) 
done 

top命令只打印出用戶名的前8個字符。是否有頂部的變體會給我完整的用戶ID?

回答

2

您可以在一行做到這一點:

ps -eo uid= | tr -d ' ' | grep -vx 0 | sort | uniq 

的步驟是:

  • 所有正在運行的進程打印的UID
  • 修剪空白(因爲ps右對齊的數字)
  • 刪除任何說0的行(例如root用戶)
  • 排序剩餘的li網元,這樣重複組合在一起
  • 刪除相鄰的重複

如果你想顯示用戶名而不是UID號:

ps -eo user= | grep -vx root | sort | uniq 

正如下面的評論中提到,你可以指定ruidruser而不是uiduser,如果您想要進程的「真實」(而不是「有效」)UID或用戶名。 (如果運行setuid程序,則「有效」用戶是程序的所有者,但「真實」用戶仍然是您)。

此外,您可以將-c添加到uniq命令以獲得如何許多進程每個用戶擁有。你甚至可以通過多個進程重新排序:

ps -eo user= | grep -vx root | sort | uniq -c | sort -nr 
+2

ps -eo ruser =如果需要名稱而不是UID。 – crafter

+0

哇。這很棒。我得到一些額外的用戶tho –

+0

如果您正在尋找所有在系統上運行任何用戶的用戶,是什麼讓用戶「額外」? – Wyzard