2016-12-03 82 views
1

我是bash腳本編程的新手。我正在嘗試做一個簡單的任務。試圖列出所有登錄用戶以及他們正在使用的過程。Bash腳本,收集集合中的信息

當我做$(who),我得到如下:

user1 console Nov 19 21:08 
user1 ttys010 Nov 28 09:32 

我期待我的腳本輸出類似:

user1:console 
user1:ttys010 

對於這一點,我想做到以下幾點。

userlist=$(who) 
for users in $userlist 
do 
    echo $users 
done 

我所期待的輸出是$用戶將有以下值:

$users[0] : user1 console Nov 19 21:08 (so that I could use 'cut' command to get what I wanted) 

而是爲$用戶的真正價值,當我運行此命令是:

$users[0] = user1 
$users[1] = console 
$users[2] = Nov 

如果有人能指出我如何實現,將不勝感激。 這不是關於獲取登錄用戶,而是關於學習如何使用輸入和循環。

回答

1

for循環的語法是:

for NAME [ [in [WORDS ...] ] ; ] do COMMANDS; done 

其中WORDS$IFS - 分隔字符串。

表達式userlist=$(who)who命令的輸出分配給userlist變量。如果$userlist變量沒有用雙引號引起來,它將擴展爲由$IFS字符(特別是換行符和空格)分隔的單詞。

因此,以下循環迭代$userlist字符串(who命令的輸出)中的所有字。

for word in $userlist; do echo "$word"; done 

爲了捕獲輸出的前兩個字段,你可以使用AWK工具如下:

who | awk '{print $1 ":" $2}' 

變量$1$2指的是第一和記錄第二場。

記錄由AWK的RS(記錄分隔符)built-in variable中指定的字符分隔。默認情況下,RS等於單個換行符。

同樣,FS內置變量指定字段分隔符。它的默認值是空格。

+0

感謝魯斯蘭了詳細的回答和解釋。這讓我深入瞭解這些事情是如何工作的。作爲新手腳本世界,我非常感謝 –

1

使用readwhile循環:

userlist=$(who) 
while read user line other; do 
    echo "$user":"$line"; 
done <<< "$userlist" 

對於每個行:

  • userline被設置爲who命令的第一個兩個字符串(在other變量是其餘的線,這裏不使用)。
  • 的變量都回蕩着一個:分隔符。

或者與cut

who | tr -s ' ' | cut -d' ' -f1,2 --output-delimiter=$':' 
+0

感謝您的回答。現在我的頭腦非常清晰,這是如何工作的。 –