2015-12-03 60 views
0

我正在嘗試編寫一個使用finger命令顯示唯一名稱,用戶名和日期的shell腳本。在Bash中使用手指來顯示唯一名稱

現在當我輸入的手指,它顯示..

Login  Name    Tty  Idle Login Time Office  
1xyz  xyz    pts/13   Dec 2 18:24 (76.126.34.32) 
1xyz  xyz    pts/13   Dec 2 18:24 (76.126.34.32) 
2xxxx  xxxx    pts/23  2 Dec 2 21:35 (108.252.136.12) 
2zzzz  zzzz    pts/61  13 Dec 2 20:46 (24.4.205.223) 
2yyyy  yyyy    pts/32  57 Dec 2 21:06 (205.154.255.145) 
1zzz  zzz    pts/35  37 Dec 2 20:56 (71.198.36.189) 
1zzz  zzz    pts/48  12 Dec 2 20:56 (71.198.36.189) 

我會消除用戶名的唯一值並顯示它像腳本..

xyz  (1xyz)   Dec 2 18:24 
xxxx  (2xxxx)   Dec 2 21:35 
zzzz  (2zzzz)   Dec 2 20:46 
yyyy  (2yyyy)   Dec 2 21:06 
zzz  (1zzz)   Dec 2 20:56 

的名稱是在第一列和用戶名是在()和日期是最後一列

在此先感謝!

回答

1

醜但應該工作。

finger | sed 's/\t/ /' | sed 's/pts\/[0-9]* *[0-9]*//' | awk '{print $2"\t("$1")\t"$3" "$4" "$5}' | sort | uniq

0

sort-u獨特的名稱是容易的部分。
當您只想解析示例中的數據時,可以嘗試在一個命令中匹配所有字符串。

finger | sed 's/^\([^ ]*\) *\([^ ]*\) *pts[^A-Z]*\([^(]*\).*/\2\t(\1)\t\3/' 

然而,這是艱苦的工作和等待失敗。我的finger返回

Login  Name     Tty  Idle Login Time Where 
notroot notroot    *:0   - Nov 26 15:30 console 
notroot notroot    pts/0  7d Nov 26 15:30 
notroot notroot    *pts/1  - Nov 26 15:30 

您可以嘗試改善sed命令,祝你好運!
我認爲唯一的方法就是查看列:每次讀取一行手指並將每行切片爲${line:start:len}分成部分(然後刪除空格)。有一個很好的計數(並注意that_user_with_a_long_name)。