誰常上機?
我們將分析 last 指令的輸出, 像這樣, 分別統計四件事:
- 每個人上機幾次?
- 一週七天當中, 每一天有多少人次上機?
- 每個人總連線時間有幾分鐘?
- 一週七天當中, 每一天累積有多少分鐘的上線?
先用慢動作分解第一項任務如下:
- 首先看一下 last 的輸出:
last | less
- 把使用者名稱的欄位抓出來:
last | perl -ne 'print "$1\n" if /^(\w+)/'
這裡的 $1 表示 「第一對小括弧裡面的東西」。 - 把印出來的使用者名稱排序一下, 讓相同的列接連出現:
last | perl -ne 'print "$1\n" if /^(\w+)/' | sort
- 去除接連著重複的列:
last | perl -ne 'print "$1\n" if /^(\w+)/' | sort | uniq
- 順便數一下重複了多少次:
last | perl -ne 'print "$1\n" if /^(\w+)/' | sort | uniq -c
- 按照次數排名:
last | perl -ne 'print "$1\n" if /^(\w+)/' | sort | uniq -c | sort -n
這裡的 sort -n 是指 「視為數字 (numerical) 排序」
這就是 組合的力量。 最強大的軟體, 不是唯一一套 「宇宙無敵超級至尊完美應用程式」, 而是一群可以排列組合的簡單工具。 請沉澱您的心思, 好好思考幾分鐘。 這, 才是學電腦的王道。
第二項任務就很簡單了: 只需要修改 regexp。 最後完整的指令如下:
last | perl -ne 'print "$1\n" if / ([A-Z]\w\w) /' | sort |
uniq -c | sort -n
要進行第三項任務之前, 請先把這句話 (打在同一列, 中間勿換列)
剪貼到您的命令列上: function sum_hour_min() { perl -ane
'$x{$F[0]}+=$F[1]*60+$F[2]; END { printf "%-8s %6d\n", $_, $x{$_}
for keys %x}'; }
這會產生一個新的指令
sum_hour_min
它會根據第一個欄位, 對後面的 「時」
「分」 加總。 請執行 sum_hour_min
-- 終端機彷彿當掉,
其實並沒有。 把下面資料剪貼到終端機上 (空白多寡無所謂) :
Mon 0 25 Tue 2 47 Mon 1 13 Fri 1 30 Mon 0 6 Tue 1 25
最後按 Enter, 它就會印出統計結果。 請人工驗算一下。 若將上面那句 function ... 貼到 ~/.bashrc 最下面, 以後每次登入都有這個指令可用; 不然, 下次登入就失效了。 不必擔心看不懂這個指令, 只要知道如何產生它需要的輸入格式就可以了。
- 抓出使用者名稱, 小時, 分鐘等三個欄位:
last | perl -ne 'print "$1 $2 $3\n" if /^(\w+).*\((\d\d):(\d\d)\)/'
- 把上面的結果餵給 sum_hour_min 吃:
... | sum_hour_min
- 把上面的結果根據總分鐘數排序:
... | sort -n -k 2
這裡的 sort -k 2 是指 「根據第二個欄位排序」
同樣地, 第四項任務, 只需要修改 regexp 就可以了。 就當做是作業吧。
- 本頁最新版網址: https://frdm.cyut.edu.tw/~ckhung/b/re/freq.php; 您所看到的版本: February 14 2012 10:32:25.
- 作者: 朝陽科技大學 資訊管理系 洪朝貴
- 寶貝你我的地球, 請 減少列印, 多用背面, 丟棄時做垃圾分類。
- 本文件以 Creative Commons Attribution-ShareAlike License 或以 Free Document License 方式公開授權大眾自由複製/修改/散佈。