在日常的辦公環境中使用 UNIX? 並不一定是非常笨拙的。使用 UNIX Shell 的強大功能和可用的系統工具可以極大地提高您在辦公中的工作效率。
引言
UNIX? 命令列的語言以功能全面而著稱,通過使用各種小型工具、公用程式,並在 Shell 中將它們組合在一起執行,您可以指定許多精確的和複雜的任務。
但是,當在辦公環境中使用它們時,同樣的這些工具可能成為提高您工作效率的功能強大的助手。許多 UNIX 獨特的技巧可以用於提高工作效率。
對於使用命令列來改善辦公工作效率,本文給出了一些建議和技巧,包括如何查看當前系統習慣、如何計算工作花費的時間、操作日期的秘訣、使用快速而簡單的方法對自己發送提醒、對重複性互動任務實現自動化的方法。
查看日常的習慣
使用 UNIX 命令列提高辦公工作效率的第一步是,仔細地研究您當前的日常習慣。通過通常所使用的工具和應用程式以及訪問和修改的檔案,可以告訴您究竟是什麼樣日常工作佔用了大量的時間,以及應該避免哪些操作。
查看所使用的工具
您需要查看經常使用哪些工具和應用程式。可以輕鬆地在 Shell 的內建 history 中查明您的日常工作習慣,它將輸出在當前的和過去的會話中發送給 Shell 的輸入行內容的枚舉清單。有關典型的樣本,請參見清單 1。
清單 1. Shell 的內建 history 的樣本輸出
$ history
1 who
2 ls
3 cd /usr/local/proj
4 ls
5 cd websphere
6 ls
7 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 標誌搜尋比它更新的檔案:
$ date
Mon Oct 23 09:42:42 EDT 2006
$ touch -t 10230842 temp
$ ls -l temp
-rw-r--r-- 1 joe joe 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 指令碼的樣本
$ typespeed
The quick brown fox jumped over the lazy dog. The quick brown dog--
...
--jumped over the lazy fox.
^D
You 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 命令的樣本
$ leave
When do you have to leave? 1830
Alarm 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 joe
Subject: Call VP on Monday
^D
Cc:
Null message body; hope that's ok
$
實現重複性互動工作的自動化
Expect 語言(是 Tcl/Tk 的擴充,還有其他的變種可供使用)用來編寫與互動式程式運行會話的指令碼,而該指令碼就好像是一個使用者,直接與程式進行互動。
Expect 指令碼可以為您節省大量的時間,特別是當您發現自己進行中重複性任務的時候。Expect 可以與多個程式進行互動,包括 Shell 和基於文本的 網頁瀏覽器,它可以啟動遠端工作階段,並通過網路進行執行。
例如,如果您需要頻繁地串連到本地內部網中的系統,以運行特定的程式,比如 test-servers 命令,您可以使用一個名為 servmaint 的 Expect 指令碼實現自動化,該指令碼的內容如清單 6 所示。
清單 6. 使用 Expect 指令碼實現遠程系統程式執行的自動化的樣本
#!/usr/bin/expect -f
spawn telnet webserv4
expect "login:"
send "joe/r"
expect "Password:"
send "secret/r"
expect "webserv4>$"
send "test-servers/r"
expect "webserv4>$"
send "bye/r"
expect eof
現在,對於整個執行過程,不再需要運行 telnet 串連到遠程系統,使用您的使用者名稱和密碼進行登入,在該系統上運行這些命令,然後登出。您只需運行清單 6 中給出的 servmaint 指令碼,就可以自動完成所有的工作。當然,如果您在這種指令碼中提供了密碼或其他專用的資訊,那麼就有一個安全性因素需要考慮,至少,您應該更改該檔案的許可權,以確保您是唯一可以讀取它的使用者(除超級使用者之外)。
可以在 Expect 中對涉及到系統互動的重複性任務進行編程,它提供了分支、條件以及進階語言的所有其他特性,以便與這些程式互動的響應和方向能夠完全實現自動化。
結束語
在辦公環境中,UNIX 系統可以處理許多任務,而通常情況下,這些任務由運行其他動作系統的單獨的電腦進行處理,使用 UNIX 系統中豐富的命令列工具,可以提高工作效率,而在任何其他的地方根本找不到這些工具。
本文介紹了一些使用 UNIX 命令列工具和應用程式來提高辦公工作效率的技巧和概念。您可以將這些思想應用於自己的辦公環境,靈活地使用命令列工具,可以提供更多的方式以節省時間並提高工作效率。
原文地址:http://www.ibm.com/developerworks/cn/aix/library/au-productivitytips.html
上面有不少好的參考資料