誰常上機?

我們將分析 last 指令的輸出, 像這樣, 分別統計四件事:

  1. 每個人上機幾次?
  2. 一週七天當中, 每一天有多少人次上機?
  3. 每個人總連線時間有幾分鐘?
  4. 一週七天當中, 每一天累積有多少分鐘的上線?

先用慢動作分解第一項任務如下:

  1. 首先看一下 last 的輸出: last | less
  2. 把使用者名稱的欄位抓出來: last | perl -ne 'print "$1\n" if /^(\w+)/' 這裡的 $1 表示 「第一對小括弧裡面的東西」。
  3. 把印出來的使用者名稱排序一下, 讓相同的列接連出現: last | perl -ne 'print "$1\n" if /^(\w+)/' | sort
  4. 去除接連著重複的列: last | perl -ne 'print "$1\n" if /^(\w+)/' | sort | uniq
  5. 順便數一下重複了多少次: last | perl -ne 'print "$1\n" if /^(\w+)/' | sort | uniq -c
  6. 按照次數排名: 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 最下面, 以後每次登入都有這個指令可用; 不然, 下次登入就失效了。 不必擔心看不懂這個指令, 只要知道如何產生它需要的輸入格式就可以了。

  1. 抓出使用者名稱, 小時, 分鐘等三個欄位: last | perl -ne 'print "$1 $2 $3\n" if /^(\w+).*\((\d\d):(\d\d)\)/'
  2. 把上面的結果餵給 sum_hour_min 吃: ... | sum_hour_min
  3. 把上面的結果根據總分鐘數排序: ... | sort -n -k 2 這裡的 sort -k 2 是指 「根據第二個欄位排序」

同樣地, 第四項任務, 只需要修改 regexp 就可以了。 就當做是作業吧。