UNIX 高手的另外 10 個習慣

讓咱們面對現實吧:壞習慣很難改變。可是您已經熟悉的習慣可能更難克服。有時,從新審視某些事情可能讓您遇到「啊哈,我沒想到它能作到這一點!」的時刻。在 Michael Stutz 的優秀文章「UNIX 高手的 10 個習慣」的基礎上,本文將提供另外 10 個 UNIX 命令行命令、工具和技術,可使您成爲更高效的 UNIX 命令行高手。html

您應當採納的其餘 10 個好習慣包括:正則表達式

  • 使用文件名自動完成功能 (file name completion)。
  • 使用歷史擴展。
  • 重用之前的參數。
  • 使用 pushdpopd 管理目錄導航。
  • 查找大型文件。
  • 不使用編輯器建立臨時文件。
  • 使用 curl 命令行實用工具。
  • 最有效地利用正則表達式。
  • 肯定當前用戶。
  • 使用 awk 處理數據。

經常使用首字母縮寫詞

  • MB:兆字節
  • HTTP:超文本傳輸協議
  • HTTPS:HTTP over Secure Sockets Layer
  • FTP:文件傳輸協議
  • FTPS:FTP over Secure Sockets Layer
  • LDAP:輕型目錄訪問協議

使用文件名完成

若是不須要在命令提示符處鍵入長的、使人費解的文件名,這是否是很棒呢?的確,您不須要這樣作。相反,您能夠配置最流行的 UNIX Shell 以使用文件名完成。該功能在各個 Shell 中的工做方式略有不一樣,所以我將向您展現如何在最流行的 Shell 中使用文件名完成。文件名完成使您能夠更快地輸入並避免錯誤。懶惰?也許吧。效率更高?固然!express

我正在運行哪一種 Shell?

若是您不知道目前使用的是哪種 Shell,會怎麼樣?雖然這個訣竅不是另外 10 個好習慣的正式組成部分,但它仍然頗有用。如清單 1 所示,您可使用 echo $0ps -p $$ 命令顯示您正在使用的 Shell。對於我來講,運行的是 Bash Shell。bash

清單 1. 肯定您的 Shell
$ echo $0
-bash
$ ps –p $$
PID TTY           TIME CMD
6344 ttys000    0:00.02 –bash

C Shell

C Shell 支持最直接文件名完成功能。設置 filec 變量可啓用該功能。(您可使用命令 set filec。)在您開始鍵入文件名後,能夠按 Esc 鍵,Shell 將完成文件名,或完成儘量多的部分。例如,假設您擁有名爲 file一、file2file3 的文件。若是您鍵入 f,而後按 Esc 鍵,將填充 file,而您必須鍵入 123 來完成相應的文件名。服務器

Bash

Bash Shell 也提供了文件名完成,但使用 Tab 鍵代替 Esc 鍵。您在 Bash Shell 中不須要設置任何選項便可啓用文件名完成,該選項是缺省設置的。Bash 還實現了其餘功能。鍵入文件名的一部分後,按 Tab 鍵,若是有多個文件知足您的請求,而且您須要添加文本以選擇其中一個文件,那麼您能夠多按 Tab 鍵兩次,以顯示與您目前鍵入的內容相匹配的文件的列表。使用以前名爲 file一、file2file3 的文件示例,首先鍵入 f。當您按一次 Tab 鍵時,Bash 完成 file;再按一次 Tab 鍵時,將展開列表 file1 file2 file3。            curl

Korn Shell

對於 Korn Shell 用戶,文件名完成取決於 EDITOR 變量的值。若是 EDITOR 設置爲 vi,那麼您鍵入部分名稱,而後按 Esc 鍵,後跟反斜槓 (\) 字符。若是 EDITOR 設置爲 emacs,那麼您鍵入部分名稱,而後按兩次 Esc 鍵以完成文件名。編輯器

使用歷史擴展

若是您爲一系列命令使用相同的文件名,會發生什麼狀況?固然,有一種快捷方式能夠快速得到您上次使用的文件名。如清單 2 所示,!$ 命令返回前一個命令使用的文件名。從文件 this-is-a-long-lunch-menu-file.txt 中搜索單詞 pickles 的出現位置。搜索結束後,使用 vi 命令來編輯 this-is-a-long-lunch-menu-file.txt 文件,而不須要從新鍵入文件名。您使用感嘆號 (!) 來訪問歷史,而後使用美圓符號 ($) 返回前一命令的最後字段。若是您反覆用到長文件名,那麼這是一個很是好的工具。ide

清單 2. 使用 !$ 得到前一個命令使用的文件名
$ grep pickles this-is-a-long-lunch-menu-file.txt
pastrami on rye with pickles and onions
$ vi !$

重用之前的參數

!$ 命令返回某個命令使用的上一個文件名參數。但若是某個命令使用多個文件名,而您只但願重用其中一個文件名,該如何作?!:1 操做符返回某個命令使用的第一個文件名。清單 3 中的示例顯示能夠如何將此操做符與 !$ 運算符組合使用。在第一個命令中,將一個文件從新命名爲更有意義的名稱,但爲了保持原始文件名可用,建立了一個符號連接。從新命名文件 kxp12.c 以提升可讀性,而後使用 link 命令來建立到原始文件名的符號連接,以防在其餘位置使用該文件名。!$ 操做符返回 file_system_access.c 文件名,而 !:1 操做符返回 kxp12.c 文件名,該文件名是上個命令的第一個文件名。函數

清單 3. 組合使用 !$ 和 !:1
$ mv kxp12.c file_system_access.c
$ ln –s !$ !:1

使用 pushd 和 popd 管理目錄導航

UNIX 支持各類目錄導航工具。我最喜歡的兩款提升工做效率的工具是 pushdpopd。您固然瞭解 cd 命令用於更改您的當前目錄。若是您要在多個目錄中導航,但但願可以快速返回某個位置,該如何作?pushdpopd 命令建立一個虛擬目錄堆棧,pushd 命令用來更改您的當前目錄並將其存儲在堆棧中,而 popd 命令用來從堆棧的頂部移除目錄並使您返回該位置。您可使用 dirs 命令來顯示當前目錄堆棧,而不會壓入或彈出新目錄。清單 4 顯示如何使用 pushdpopd 命令在目錄樹中快速導航。工具

清單 4. 使用 pushd 和 popd 在目錄樹中導航
$ pushd .
~ ~
$ pushd /etc
/etc ~ ~
$ pushd /var
/var /etc ~ ~
$ pushd /usr/local/bin
/usr/local/bin /var /etc ~ ~
$ dirs
/usr/local/bin /var /etc ~ ~
$ popd
/var /etc ~ ~
$ popd
/etc ~ ~
$ popd
~ ~
$ popd

pushdpopd 命令還支持使用參數處理目錄堆棧。使用 +n-n 參數,其中 n 是一個數字,您能夠向左或向右移動堆棧,如清單 5 所示。

清單 5. 旋轉目錄堆棧
$ dirs
/usr/local/bin /var /etc ~ ~
$ pushd +1
/var /etc ~ ~ /usr/local/bin
$ pushd -1
~ /usr/local/bin /var /etc ~

查找大型文件

是否須要找出您的全部空閒磁盤空間被什麼佔用了?您可使用如下幾個工具來管理您的存儲設備。如清單 6 所示,df 命令爲您顯示每一個可用捲上已使用的塊的總數,以及空閒空間的百分比。

清單 6. 肯定卷的使用狀況
$ df
Filesystem                            512-blocks      Used  Available Capacity  Mounted on
/dev/disk0s2                           311909984 267275264   44122720    86%    /
devfs                                        224       224          0   100%    /dev
fdesc                                          2         2          0   100%    /dev
map -hosts                                     0         0          0   100%    /net
map auto_home                                  0         0          0   100%    /home

是否但願查找大型文件?使用 find 命令時附帶 -size 參數。清單 7 顯示瞭如何使用 find 命令來查找大於 10MB 的文件。請注意,-size 參數以 KB 爲單位計量大小。

清單 7. 查找大於 10MB 的全部文件
$ find / -size +10000k –xdev –exec ls –lh {}\;

不使用編輯器建立臨時文件

如下是一個簡單示例:您須要快速建立一個簡單臨時文件,但不但願啓動您的編輯器。使用帶有 > 文件重定向操做符的 cat 命令。如清單 8 所示,使用不帶文件名的 cat 命令只回顯向標準輸入鍵入的任何內容;> 重定向將該輸入捕獲到指定的文件中。請注意,您在結束鍵入時必須提供文件結束字符,一般爲 Ctrl-D。

清單 8. 快速建立臨時文件
$ cat > my_temp_file.txt
This is my temp file text
^D
$ cat my_temp_file.txt
This is my temp file text

須要執行相同操做,可是附加到現有文件而不是建立新文件。如清單 9 所示,改用 >> 操做符。>> 文件重定向操做符向現有文件附加內容。

清單 9.快速向文件附加內容
$ cat >> my_temp_file.txt
More text
^D
$ cat my_temp_file.txt
This is my temp file text
More text

使用 curl 命令行實用工具

我是否能夠從命令行訪問 Web?你瘋了嗎?沒有,這就是 curl 的用途!curl 命令使您可使用 HTTP、HTTPS、FTP、FTPS、Gopher、DICT、TELNET、LDAP 或 FILE 協議從服務器檢索數據。如清單 10 所示,我可使用 curl 命令從美國國家氣象局瞭解我所在位置(紐約州布法羅市)的當前天氣情況。當與 grep 命令組合使用時,我能夠檢索布法羅市的天氣情況。使用 -s 命令行選項來禁止 curl 處理輸出。

清單 10. 使用 curl 檢索當前天氣情況
$ curl –s http://www.srh.noaa.gov/data/ALY/RWRALY | grep BUFFALO
BUFFALO        MOSUNNY   43  22  43 NE13      30.10R

清單 11 所示,您也可使用 curl 命令來下載 HTTP 託管的文件。使用 -o 參數來指定保存輸出的位置。

清單 11. 使用 curl 下載 HTTP 承載的文件
$ curl -o archive.tar http://www.somesite.com/archive.tar

這實際上只是您使用 curl 命令能夠完成的操做的提示。您只需在命令提示符處鍵入 man curl 顯示 curl 命令的完整使用信息,就能夠開始瞭解更多內容。

最有效地利用正則表達式

大量 UNIX 命令使用正則表達式做爲參數。從技術角度而言,正則表達式 是表示某種模式的字符串(也就是說,由字母、數字和符號組成的字符序列),用於定義零或更長的字符串。正則表達式使用元字符(例如,星號 [*] 和問號 [?])來匹配其餘字符串的部分或所有內容。正則表達式不必定包含通配符,但通配符可使正則表達式在搜索模式和處理文件時發揮更大的做用。表 1 顯示了一些基本正則表達式序列。

表 1. 正則表達式序列
序列 說明
脫字符 (^) 匹配出如今行首的表達式,例如 ^A
美圓符號 ($) 匹配出如今行末的表達式,例如 A$
反斜槓 (\) 取消下一個字符的特殊含義,例如 \^
方括號 ([]) 匹配括起來的任一字符,例如 [aeiou](使用連字符 [-] 表示範圍,例如 [0-9])。
[^ ] 匹配除括起來字符之外的任一字符,例如 [^0-9]
句點 (.) 匹配除行尾以外的任意單個字符
星號 (*) 匹配零個或多個前驅字符或表達式
\{x,y\} 匹配出現過 xy 個和前面相同的內容
\{x\} 精確匹配出現過 x 個和前面相同的內容
\{x,\} 匹配出現過 x 個或更多和前面相同的內容

清單 12 顯示了與 grep 命令一塊兒使用的一些基本正則表達式。

清單 12. 使用正則表達式和 grep
$ # Lists your mail
$ grep '^From: ' /usr/mail/$USER   
$ # Any line with at least one letter  
$ grep '[a-zA-Z]'  search-file.txt
$ # Anything not a letter or number
$ grep '[^a-zA-Z0-9] search-file.txt
$ # Find phone numbers in the form 999-9999 
$ grep '[0-9]\{3\}-[0-9]\{4\}' search-file.txt
$ # Find lines with exactly one character
$ grep '^.$' search-file.txt
$ #  Find any line that starts with a period "."          
$ grep '^\.' search-file.txt 
$ # Find lines that  start with a "." and 2 lowercase letters
$ grep '^\.[a-z][a-z]' search-file.txt

有大量書籍專門講述正則表達式。有關命令行正則表達式的深刻描述,建議您閱讀 developerWorks 文章「對話 UNIX,第 9 部分:正則表達式。」

肯定當前用戶

有時,您可能但願肯定某個特定用戶是否運行過您的管理腳本。爲找出答案,您可使用 whoami 命令來返回當前用戶的名稱。清單 13 顯示了獨自運行的 whoami 命令;清單 14 顯示了使用 whoami 確保當前用戶不是根用戶的 Bash 腳本的摘錄。

清單 13. 從命令行使用 whoami
$ whoami
John
清單 14. 在腳本中使用 whoami
if [ $(whoami) = "root" ]
then
   echo "You cannot run this script as root."
   exit 1
fi

使用 awk 處理數據

awk 命令彷佛始終處在 Perl 的陰影下,但它對於簡單、基於命令行的數據處理來講是一個快速、實用的工具。清單 15 顯示瞭如何開始使用 awk 命令。若要獲取文件中每行文本的長度,請使用 length() 函數。若要查看字符串 ing 是否出如今文件文本中,請使用 index() 函數,該函數返回 ing 首次出現的位置,這樣您就可使用它來進行進一步的字符串處理。若要 tokenize(也就是說,將一行拆分爲單詞長度的片斷)某個字符串,請使用 split() 函數。

清單 15. 基本 awk 處理
$ cat text
testing the awk command
$ awk '{ i = length($0); print i }' text
23
$ awk '{ i = index($0,」ing」); print i}' text
5
$ awk 'BEGIN { i = 1 } { n = split($0,a," "); while (i <= n) {print a[i]; i++;} }' text
testing 
the
awk
command

打印文本文件中的指定字段是一項簡單的 awk 任務。在清單 16 中,sales 文件包含每一個銷售人員的姓名,後跟每個月銷售數字。您可使用 awk 命令來快速得到每月的銷售總額。缺省狀況下,awk 將每一個以逗號分隔的值視爲不一樣的字段。您使用 $n 操做符來訪問每一個字段。

清單 16. 使用 awk 對數據進行彙總
$cat sales
Gene,12,23,7
Dawn,10,25,15
Renee,15,13,18
David,8,21,17
$ awk -F, '{print $1,$2+$3+$4}' sales
Gene 42
Dawn 50
Renee 46
David 46

awk 命令能夠很複雜並應用於普遍的情景中。若要更完整地學習 awk 命令,請從命令 man awk 開始,並參閱參考資料部分提供的資源。

結束語

成爲命令行高手須要進行一些實踐。按照相同的方式處理問題很簡單,由於您已經習慣了。擴展您的命令行資源能夠顯著提升您的工做效率,並促使您朝着 UNIX 命令行高手的方向前進!

 

原文連接

英文版:http://www.ibm.com/developerworks/aix/library/au-unixtips/?S_CMP=cn-a-aix&S_TACT=105AGX52

中文版:https://www.ibm.com/developerworks/cn/aix/library/au-unixtips/

相關文章
相關標籤/搜索