UNIX 生產力技巧
引言
Unix® 命令行的語言以功能全面而著稱,通過使用各種小型工具、實用程序,并在 Shell 中將它們組合在一起執行,您可以指定許多精確的和復雜的任務。
但是,當在辦公環境中使用它們時,同樣的這些工具可能成為提高您工作效率的功能強大的助手。許多 UNIX 獨特的技巧可以用于提高工作效率。
對于使用命令行來改善辦公工作效率,本文給出了一些建議和技巧,包括如何查看當前系統習慣、如何計算工作花費的時間、操作日期的秘訣、使用快速而簡單的方法對自己發送提醒、對重復性交互任務實現自動化的方法。
查看日常的習慣
使用 UNIX 命令行提高辦公工作效率的第一步是,仔細地研究您當前的日常習慣。通過通常所使用的工具和應用程序以及訪問和修改的文件,可以告訴您究竟是什么樣日常工作占用了大量的時間,以及應該避免哪些操作。
查看所使用的工具
您需要查看經常使用哪些工具和應用程序。可以輕松地在 Shell 的內置 history 中查明您的日常工作習慣,它將輸出在當前的和過去的會話中發送給 Shell 的輸入行內容的枚舉清單。有關典型的示例,請參見清單 1。
清單 1. Shell 的內置 history 的示例輸出
$ history1 who2 ls3 cd /usr/local/proj4 ls5 cd websphere6 ls7 ls -l$
真實的歷史記錄通常保存在一個文件中,以便能夠提供給將來的會話,例如,Korn Shell 將其命令歷史記錄保存在用戶 home 目錄的隱藏文件 .sh_history 中,而 Bash Shell 則使用 .bash_history。通常在達到一定的長度后,會對這些文件進行覆蓋,但是許多 Shell 具有設置最大歷史記錄長度的變量,Korn 和 Bash Shell 具有 HISTSIZE 和 HISTFILESIZE 變量,您可以在自己的 Shell 啟動文件中對它們進行設置。
通過 sort 來運行 history 非常有用,可以獲得最常用的命令的列表。然后,使用 awk 刪除命令名稱減號選項和參數,然后將經過排序的列表傳遞給 uniq 以得到一個枚舉列表。最后,再次調用 sort 以便對列表的第一列按照相反次序進行排序(最大的在前面),這是對其自身進行枚舉。清單 2 顯示了實際操作的示例。
清單 2. 根據使用頻率列舉 Shell 歷史記錄中的命令
$ history|awk '{print $2}'|awk 'BEGIN {FS="|"} {print $1}'|sort|uniq -c|sort -r 4 ls 2 cd 1 who$
如果歷史記錄文件比較大,您可以首先通過管道傳輸到 tail 來運行周期性的檢查,例如,要檢查最后的 1,000 條命令,可以嘗試使用:
$ history|tail -1000|awk '{print $2}'|awk 'BEGIN {FS="|"} {print $1}'|sort|uniq -c|sort -r
查看訪問或修改的文件
可以使用相同的原則來查看訪問和修改過的文件。要完成這項工作,可以使用 find 實用程序來定位和查看在某一段時間內(今天、昨天或者過去的任何日期或時間段)訪問或更改過的所有文件。
通常,您無法找出到底是誰 對文件進行了最后的訪問或修改,因為在 UNIX 中不大容易獲得這種信息,但通過將搜索限制為您的 home 目錄樹中包含的文件,您可以僅查看個人的文件。您還可以對搜索進行限制,以便僅搜索您正在監視或使用的特定項目目錄中的文件。
find 實用程序有幾個標志,可以用來根據時間定位文件,如表 1 中所列舉的。目錄不是常規文件,但是在列出目錄內容或將其作為當前工作目錄時,對其進行了訪問,所以需要在搜索中使用否定和 -type 標志排除它們。
表 1. find 實用程序的一些標志
標志描述-daystart 這個標志表示從某天凌晨開始。-atime 最后訪問該文件的時間,用天數表示。-ctime 最后更改該文件狀態的時間,用天數表示。-mtime 最后修改該文件的時間,用天數表示。-amin 最后訪問該文件的時間,用分鐘數表示。(并不是在所有的實現中都可用。)-cmin 最后更改該文件狀態的時間,用分鐘數表示。(并不是在所有的實現中都可用。)-mmin 最后修改該文件的時間,用分鐘數表示。(并不是在所有的實現中都可用。)-type 這個標志描述了文件的類型,如 d 表示目錄。-user X 文件屬于用戶 X。-group X 文件屬于組 X。-newer X 文件比文件 X 更新。
下面介紹了如何列出您的 home 目錄樹中、在整整一個小時之前經過修改的所有的文件:
$ find ~ -mmin 60 ! -type d
為標志給定一個負值,表示要匹配該數值或更近的。例如,下面介紹了如何列出您的 home 目錄樹中、從一個小時之前到現在經過修改的所有的文件:
$ find ~ -mmin -60 ! -type d
并非所有的 find 實現都支持 min 標志。如果您的 find 不支持,那么您可以使用 touch 創建一個虛擬文件,它的時間戳比要找的文件早,然后使用 -newer 標志搜索比它更新的文件:
$ dateMon Oct 23 09:42:42 EDT 2006$ touch -t 10230842 temp$ ls -l temp-rw-r--r--1 joejoe 0 Oct 23 08:42 temp$ find ~ -newer temp ! -type d
特殊的 -daystart 標志,當與任何日期選項一起使用時,可以度量從當天凌晨開始(而不是 24 小時以前)到命令執行的時刻。下面的命令嘗試列舉存在于系統中的任何位置、從當天凌晨到現在訪問過的所有的文件:
$ find / -user `whoami` -daystart -atime -1 ! -type d
類似地,您可以列出 home 目錄樹中、今天修改 的所有文件:
$ find ~ -daystart -mtime -1 ! -type d
為各種時間標志賦于不同的值,可以更改搜索時間。您還可以對這些標志進行組合。例如,您可以列出 home 目錄樹中、從七天之前到現在經過訪問和 修改的所有的文件:
$ find ~ -daystart -atime -7 -mtime -7 ! -type d
您還可以根據特定日期或時間范圍(以天或分鐘進行度量)查找文件。要完成該任務,通常可以使用 touch 創建一個或多個虛擬文件,如前所述。
當您需要查找匹配某個范圍的文件時,建立兩個虛擬文件,它們的時間戳可以描述這個范圍。然后,對較舊的文件使用 -newer 標志,對第二個文件使用“! -newer。
例如,要在 /usr/share 目錄樹中查找在 2006 年 8 月經過訪問的所有文件,可以嘗試下面的命令:
$ touch -d "Aug 1 2006" file.start$ touch -d "Sep 1 2006" file.end$ find /usr/share -daystart -newer file.start ! -daystart -newer file.end
最后,在列出目錄內容時,可以按照文件的最后修改時間進行排序,這樣做有時很有幫助。有些版本的 ls 工具具有 -c 選項,它可以按照文件修改的時間進行排序,最先顯示最后修改的文件。與 -l(長清單)和 -t(按照修改時間排序)選項一同使用,您可以對目錄清單按照最后修改文件在前的順序排序,長清單可以顯示文件的修改時間而不是缺省創建時間:
$ ls -ltc /usr/local/proj/websphere | less
計算工作花費的時間
使用 UNIX 提高辦公工作效率的另一種有價值的方式是,計算經常執行的命令所花費的時間。然后,您可以對結果進行評估,并確定是否花費了過多的時間等待一個特定的進程結束。
計算命令執行所花費的時間
系統是否運行遲緩?您在 Shell 中等待了多長時間,在某個特定命令執行時,什么也做不了?完成早上的日常工作需要花費多長時間呢?
當您使用 date、sleep 和 echo 命令來計算具體任務所花費的時間時,可以獲得關于這些問題的實質性的解答。
要完成這項工作,可以輸入一行以 date 語句開頭的長輸入行,以便按照需要的格式(通常,小時和分鐘就足夠了)輸出時間和日期。然后,運行該命令輸入行(可能是由 Shell 指令串聯起來的幾行內容),最后可以使用相同的輸入行再次得到日期。如果您所測試的這些命令產生了大量的輸出,可以對其進行重定向,以便能夠閱讀到開始和停止日期。計算這兩個日期的差:
$ date; system-backup > /dev/null; system-diag > /dev/null;> netstat > /dev/null; df > /dev/null; date
測試您的打字速度
您可以使用相同的方法來測試打字輸入:
$ date;cat|wc -w;date
如果您提供一個至少持續 1 分鐘以上的輸入示例,但最好是 3 分鐘或更長的時間,那么該命令的結果將更準確。計算這兩個日期之間的差(以分鐘為單位),然后使用您所輸入的單詞數(由中間的命令輸出)除以這個值,以得到平均每分鐘輸入的單詞數。
通過為開始和停止日期以及輸出單詞數的命令設置相應的變量,您可以為這項任務實現自動化。但是為了正確地完成這項任務,您必須在使用這些時間做減法計算的時候避免一個常見的錯誤。GNU 對 date 命令進行了擴展,即 %s 格式選項,可以用來避免這樣的錯誤,它輸出自UNIX 新紀元 以來的秒數,該時間定義為 UTC 時間 1970 年 1 月 1 日凌晨。然后,您可以單獨根據秒數來計算時間。
分配一個變量 SPEED 作為 echo 命令的輸出,以便設置正確的公式通過管道傳遞給計算器工具,如 bc。然后,輸出一個新的 echo 語言,該語句將輸出關于打字速度的消息:
$ START=`date +%s`;WordS=`cat|wc -w`; STOP=`date +%s`; SPEED=> `echo "$WORDS / ( ( $STOP - $START ) / 60 )"|bc`;echo> "You have a typing speed of $SPEED words per minute."
您可以將它放到一個腳本中,然后更改其權限,以使得所有的用戶都可以執行它,以便系統中其他的用戶也可以使用它,如清單 3 所示。
清單 3. 運行 typespeed 腳本的示例
$ typespeedThe quick brown fox jumped over the lazy dog. The quick brown dog-- ...--jumped over the lazy fox.^DYou have a typing speed of 82.33333333 words per minute.$
了解日期
date 工具可以完成更多的工作,不僅僅只是打印出當前的系統日期。您可以使用它來得到給定的日期究竟是星期幾,并得到相對于當前日期的相對日期。
了解某一天是星期幾
GNU 對 date 命令的另一個擴展是 -d 選項,當您的桌上沒有日歷表時(UNIX 用戶不需要日歷表),該選項非常有用。使用這個功能強大的選項,通過將日期作為引號括起來的參數提供,您可以快速地查明一個特定的日期究竟是星期幾:
$ date -d "nov 22"Wed Nov 22 00:00:00 EST 2006$
在本示例中,您可以看到今年的 11 月 22 日是星期三。
所以,假設在 11 月 22 日召開一個重大的會議,您可以立即了解到這一天是星期三,而這一天您將趕到駐地辦公室。
獲得相對日期
-d 選項還可以告訴您,相對于 當前日期若干天的究竟是哪一天,從現在開始的若干天或若干星期以后,或者以前(過去)。通過將這個相對偏移使用引號括起來,作為 -d 選項的參數,就可以完成這項任務。
例如,您需要了解兩星期以后的日期。如果您處于 Shell 提示符處,那么可以迅速地得到答案:
$ date -d '2 weeks'
關于使用該命令,還有其他一些重要的方法。使用 next 指令,您可以得到以后的星期幾是哪一天:
$ date -d 'next monday'
使用 ago 指令,您可以得到過去的日期:
$ date -d '30 days ago'
您可以使用負數以得到相反的日期:
$ date -d 'dec 14 -2 weeks'
這個技巧非常有用,它可以根據將來的日期為自己設置提醒,可能是在腳本或 Shell 啟動文件中,如下所示:
DAY=`date -d '2 weeks' +"%b %d"`if test "`echo $DAY`" = "Aug 16"then echo 'Product launch is now two weeks away!'fi
為自己設置提醒
您可以在系統中使用各種工具為自己設置離開的提醒,與紙制便箋相比,它們占用更少的空間,并且無論您在任何地方登錄都可以看到它們。
了解何時有事需要離開
當您在系統中進行工作時,很可能會碰到其他的事情。leave 工具在 IBM AIX® 操作系統和 Berkeley Software Distribution (BSD) 系統(請參見參考資料部分)中非常常見,并且可以為您提供幫助。
為 leave 命令指定需要離開的時間,使用 24 小時的格式:HHMM。它運行于后臺,并將在給定時間之前的 5 分鐘時,在終端中輸出提醒您準備離開的信息。如果在離開前 1 分鐘時,您依然處于登錄狀態,它會再次顯示這個提醒消息,然后是在應該離開的時刻,并且在此之后每隔 1 分鐘它都會發送提醒消息,直至您注銷登錄(或者終止這個 leave 進程)。清單 4 給出了一個示例。當您注銷時,將終止這個 leave 進程。
清單 4. 運行 leave 命令的示例
$ leaveWhen do you have to leave? 1830Alarm set for Fri Aug 4 18:30. (pid 1735)$ date +"Time now: %l:%M%p"Time now: 6:20PM$<system bell rings>You have to leave in 5 minutes.$ date +"Time now: %l:%M%p"Time now: 6:25PM$<system bell rings>Just one more minute!$ date +"Time now: %l:%M%p"Time now: 6:29PM$Time to leave!$ date +"Time now: %l:%M%p"Time now: 6:30PM$<system bell rings>Time to leave!$ date +"Time now: %l:%M%p"Time now: 6:31PM$ kill 1735$ sleep 120; date +"Time now: %l:%M%p"Time now: 6:33PM$
您可以提供相對時間。如果您希望在從現在 開始的某個時間后離開,可以在時間參數前面加上 +。所以,要提醒在兩小時后離開,可以輸入下面的命令:
$ leave +0200
要以分鐘為單位提供時間,可以讓小時字段為 0。例如,如果您知道在 10 分鐘之后必須離開,可以輸入:
$ leave +0010
您還可以指定離開時間作為參數,這使得 leave 成為腳本中非常有用的命令,特別是在 Shell 啟動文件中。例如,如果您通常工作到下午 5 點,但是在星期 5 時必須在下午 4 點離開單位,那么您可以在 Shell 啟動文件中設置一個周提醒:
if test "`date +%a`" = "Fri"then leave 1600; fi
您可以在啟動腳本中加入一個簡單的 leave 語句,不帶任何參數。每次登錄 Shell 時,您可以輸入離開的時間,如果您按下 Enter 鍵,即沒有指定任何值,那么 leave 將會退出,而不會設置提醒。
為自己發送電子郵件提醒
您還可以使用文本消息為自己發送提醒。建立一則提醒消息,有些時候非常有用,您將在當前登錄會話或下次登錄時了解到這一點。
以前,舊的 elm 郵件代理附帶一個工具,它允許您使用電子郵件發送備忘錄,實際上是提醒發送者的腳本、主題和正文文本。通過基于時間的方法,使用命令行 mailx 工具向自己發送郵件,可以輕松地復制這個過程。(在一些 UNIX 系統中,使用 mail 來代替 mailx。)
將您的電子郵件地址(或您在本地系統中的用戶名,如果您在本地系統中讀取郵件)作為參數提供,然后,您可以在提示的 Subject 行中輸入提醒消息(如果它非常短),如清單 5 所示。如果提醒消息不適合于 Subject 行,那么可以在消息正文中輸入它。單獨一行 ^D,表示退出 mailx 并發送郵件。
清單 5. 使用 mailx 命令向自己發送提醒的示例
$ mailx joeSubject: Call VP on Monday^DCc:Null message body; hope that's ok$
實現重復性交互工作的自動化
Expect 語言(是 Tcl/Tk 的擴展,還有其他的變種可供使用)用來編寫與交互式程序運行會話的腳本,而該腳本就好像是一個用戶,直接與程序進行交互。
Expect 腳本可以為您節省大量的時間,特別是當您發現自己正在進行重復性任務的時候。Expect 可以與多個程序進行交互,包括 Shell 和基于文本的 Web 瀏覽器,它可以啟動遠程會話,并通過網絡進行執行。
例如,如果您需要頻繁地連接到本地內部網中的系統,以運行特定的程序,比如 test-servers 命令,您可以使用一個名為 servmaint 的 Expect 腳本實現自動化,該腳本的內容如清單 6 所示。
清單 6. 使用 Expect 腳本實現遠程系統程序執行的自動化的示例
#!/usr/bin/expect -fspawn telnet webserv4expect "login:"send "joer"expect "Password:"send "secretr"expect "webserv4>$"send "test-serversr"expect "webserv4>$"send "byer"expect eof
現在,對于整個執行過程,不再需要運行 telnet 連接到遠程系統,使用您的用戶名和密碼進行登錄,在該系統上運行這些命令,然后注銷。您只需運行清單 6 中給出的 servmaint 腳本,就可以自動完成所有的工作。當然,如果您在這種腳本中提供了密碼或其他專用的信息,那么就有一個安全性因素需要考慮,至少,您應該更改該文件的權限,以確保您是唯一可以讀取它的用戶(除超級用戶之外)。
可以在 Expect 中對涉及到系統交互的重復性任務進行編程,它提供了分支、條件以及高級語言的所有其他特性,以便與這些程序交互的響應和方向能夠完全實現自動化。
結束語
在辦公環境中,UNIX 系統可以處理許多任務,而通常情況下,這些任務由運行其他操作系統的單獨的計算機進行處理,使用 UNIX 系統中豐富的命令行工具,可以提高工作效率,而在任何其他的地方根本找不到這些工具。
本文介紹了一些使用 UNIX 命令行工具和應用程序來提高辦公工作效率的技巧和概念。您可以將這些思想應用于自己的辦公環境,靈活地使用命令行工具,可以提供更多的方式以節省時間并提高工作效率。
