UNIX 高手的 20 個習慣

form http://blog.csdn.net/tianlesoftware/archive/2011/01/15/6140900.aspx

不良的使用模式會降低您的速度,並且通常會導致意外錯誤。養成這些好習慣是加強您的 UNIX 命令行技能的積極步驟。

 

Unix 下要採用的20個好習慣爲:

1)        在單個命令中創建目錄樹。

2)        更改路徑;不要移動存檔。

3)        將命令與控制操作符組合使用。

4)        謹慎引用變量。

5)        使用轉義序列來管理較長的輸入。

6)        在列表中對命令分組。

7)         find 之外使用 xargs 

8)        瞭解何時 grep 應該執行計數——何時應該繞過。

9)        匹配輸出中的某些字段,而不只是對行進行匹配。

10)    停止對 cat 使用管道。

11)    使用文件名自動完成功能 (file name completion)

12)    使用歷史擴展。

13)    重用以前的參數。

14)    使用 pushd  popd 管理目錄導航。

15)    查找大型文件。

16)    不使用編輯器創建臨時文件。

17)    使用 curl 命令行實用工具。

18)    最有效地利用正則表達式。

19)    確定當前用戶。

20)    使用 awk 處理數據。

 

1. 在單個命令中創建目錄樹

清單 1 演示了最常見的 UNIX 壞習慣之一:一次定義一個目錄樹。

 

清單 1. 壞習慣 1 的示例:單獨定義每個目錄樹

~ $ mkdir tmp

~ $ cd tmp

~/tmp $ mkdir a

~/tmp $ cd a

~/tmp/a $ mkdir b

~/tmp/a $ cd b

~/tmp/a/b/ $ mkdir c

~/tmp/a/b/ $ cd c

~/tmp/a/b/c $

 

       使用 mkdir  -p 選項並在單個命令中創建所有父目錄及其子目錄要容易得多。但是即使對於知道此選項的管理員,他們在命令行上創建子目錄時也仍然束縛於逐步創建每級子目錄。花時間有意識地養成這個好習慣是值得的.


 
清單 2. 好習慣 1 的示例:使用一個命令來定義目錄樹

~ $ mkdir -p tmp/a/b/c

 

       您可以使用此選項來創建整個複雜的目錄樹(在腳本中使用是非常理想的),而不只是創建簡單的層次結構。


 
清單 3. 好習慣 1 的另一個示例:使用一個命令來定義複雜的目錄樹

~ $ mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}

 

       過去,單獨定義目錄的唯一藉口是您的 mkdir 實現不支持此選項,但是在大多數系統上不再是這樣了。IBMAIX®mkdirGNU mkdir 和其他遵守單一 UNIX 規範 (Single UNIX Specification) 的系統現在都具有此選項。

       對於仍然缺乏該功能的少數系統,您可以使用 mkdirhier 腳本(請參見參考資料),此腳本是執行相同功能的 mkdir 的包裝:

~ $ mkdirhier project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}

 

2. 更改路徑;不要移動存檔

       另一個不良的使用模式是將 .tar 存檔文件移動到某個目錄,因爲該目錄恰好是您希望在其中提取 .tar 文件的目錄。其實您根本不需要這樣做。您可以隨心所欲地將任何 .tar 存檔文件解壓縮到任何目錄——這就是 -C 選項的用途。在解壓縮某個存檔文件時,使用 -C 選項來指定要在其中解壓縮該文件的目錄:


清單 4. 好習慣 2 的示例:使用選項 -C 來解壓縮 .tar 存檔文件

~ $ tar xvf -C tmp/a/b/c newarc.tar.gz

 

       相對於將存檔文件移動到您希望在其中解壓縮它的位置,切換到該目錄,然後才解壓縮它,養成使用 -C 的習慣則更加可取——當存檔文件位於其他某個位置時尤其如此。

 

3. 將命令與控制操作符組合使用

       您可能已經知道,在大多數 Shell 中,您可以在單個命令行上通過在命令之間放置一個分號 (;) 來組合命令。該分號是 Shell 控制操作符,雖然它對於在單個命令行上將離散的命令串聯起來很有用,但它並不適用於所有情況。例如,假設您使用分號來組合兩個命令,其中第二個命令的正確執行完全依賴於第一個命令的成功完成。如果第一個命令未按您預期的那樣退出,第二個命令仍然會運行——結果會導致失敗。相反,應該使用更適當的控制操作符(本文將描述其中的部分操作符)。只要您的 Shell 支持它們,就值得養成使用它們的習慣。

 

3.1 僅當另一個命令返回零退出狀態時才運行某個命令

       使用 && 控制操作符來組合兩個命令,以便僅當 第一個命令返回零退出狀態時才運行第二個命令。換句話說,如果第一個命令運行成功,則第二個命令將運行。如果第一個命令失敗,則第二個命令根本就不運行。例如:


清單 5. 好習慣 3 的示例:將命令與控制操作符組合使用

~ $ cd tmp/a/b/c && tar xvf ~/archive.tar

 

       在此例中,存檔的內容將提取到 ~/tmp/a/b/c 目錄中,除非該目錄不存在。如果該目錄不存在,則 tar 命令不會運行,因此不會提取任何內容。

 

3.2 僅當另一個命令返回非零退出狀態時才運行某個命令

       類似地,|| 控制操作符分隔兩個命令,並且僅當第一個命令返回非零退出狀態時才運行第二個命令。換句話說,如果第一個命令成功,則第二個命令不會運行。如果第一個命令失敗,則第二個命令纔會 運行。在測試某個給定目錄是否存在時,通常使用此操作符,如果該目錄不存在,則創建它:


清單 6. 好習慣 3 的另一個示例:將命令與控制操作符組合使用

~ $ cd tmp/a/b/c || mkdir -p tmp/a/b/c

 

       您還可以組合使用本部分中描述的控制操作符。每個操作符都影響最後的命令運行:


清單 7. 好習慣 3 的組合示例:將命令與控制操作符組合使用

~ $ cd tmp/a/b/c || mkdir -p tmp/a/b/c && tar xvf -C tmp/a/b/c ~/archive.tar

 

 

4. 謹慎引用變量

       始終要謹慎使用 Shell 擴展和變量名稱。一般最好將變量調用包括在雙引號中,除非您有不這樣做的足夠理由。類似地,如果您直接在字母數字文本後面使用變量名稱,則還要確保將該變量名稱包括在方括號 ([]) 中,以使其與周圍的文本區分開來。否則,Shell 將把尾隨文本解釋爲變量名稱的一部分——並且很可能返回一個空值。清單 8 提供了變量的各種引用和非引用及其影響的示例。


清單 8. 好習慣 4 的示例:引用(和非引用)變量

~ $ ls tmp/

a b

~ $ VAR="tmp/*"

~ $ echo $VAR

tmp/a tmp/b

~ $ echo "$VAR"

tmp/*

~ $ echo $VARa

~ $ echo "$VARa"

~ $ echo "${VAR}a"

tmp/*a

~ $ echo ${VAR}a

tmp/a

~ $

 

5. 使用轉義序列來管理較長的輸入

       您或許看到過使用反斜槓 (/) 來將較長的行延續到下一行的代碼示例,並且您知道大多數 Shell 都將您通過反斜槓聯接的後續行上鍵入的內容視爲單個長行。然而,您可能沒有在命令行中像通常那樣利用此功能。如果您的終端無法正確處理多行迴繞,或者您的命令行比通常小(例如在提示符下有長路經的時候),反斜槓就特別有用。反斜槓對於瞭解鍵入的長輸入行的含義也非常有用,如以下示例所示:


清單 9. 好習慣 5 的示例:將反斜槓用於長輸入

~ $ cd tmp/a/b/c || /

> mkdir -p tmp/a/b/c && /

> tar xvf -C tmp/a/b/c ~/archive.tar

 

或者,也可以使用以下配置:
清單 10. 好習慣 5 的替代示例:將反斜槓用於長輸入

~ $ cd tmp/a/b/c /

>                 || /

> mkdir -p tmp/a/b/c /

>                    && /

> tar xvf -C tmp/a/b/c ~/archive.tar

 

       然而,當您將輸入行劃分到多行上時,Shell 始終將其視爲單個連續的行,因爲它總是刪除所有反斜槓和額外的空格。

       注意:在大多數 Shell 中,當您按向上箭頭鍵時,整個多行輸入將重繪到單個長輸入行上。

 

6. 在列表中對命令分組

       大多數 Shell 都具有在列表中對命令分組的方法,以便您能將它們的合計輸出向下傳遞到某個管道,或者將其任何部分或全部流重定向到相同的地方。您一般可以通過在某個 Subshell 中運行一個命令列表或通過在當前 Shell 中運行一個命令列表來實現此目的。

 

6.1  Subshell 中運行命令列表

       使用括號將命令列表包括在單個組中。這樣做將在一個新的 Subshell 中運行命令,並允許您重定向或收集整組命令的輸出,如以下示例所示:


清單 11. 好習慣 6 的示例:在 Subshell 中運行命令列表

~ $ ( cd tmp/a/b/c/ || mkdir -p tmp/a/b/c && /

> VAR=$PWD; cd ~; tar xvf -C $VAR archive.tar ) /

> | mailx admin -S "Archive contents"

 

       在此示例中,該存檔的內容將提取到 tmp/a/b/c/ 目錄中,同時將分組命令的輸出(包括所提取文件的列表)通過郵件發送到地址 admin

       當您在命令列表中重新定義環境變量,並且您不希望將那些定義應用於當前 Shell 時,使用 Subshell 更可取。

 

6.2 在當前 Shell 中運行命令列表

       將命令列表用大括號 ({}) 括起來,以在當前 Shell 中運行。確保在括號與實際命令之間包括空格,否則 Shell 可能無法正確解釋括號。此外,還要確保列表中的最後一個命令以分號結尾,如以下示例所示:


清單 12. 好習慣 6 的另一個示例:在當前 Shell 中運行命令列表

~ $ { cp ${VAR}a . && chown -R guest.guest a && /

> tar cvf newarchive.tar a; } | mailx admin -S "New archive"

 

7.  find 之外使用 xargs

       使用 xargs 工具作爲篩選器,以充分利用從 find 命令挑選的輸出。find 運行通常提供與某些條件匹配的文件列表。此列表被傳遞到 xargs 上,後者然後使用該文件列表作爲參數來運行其他某些有用的命令,如以下示例所示:


清單 13. xargs 工具的經典用法示例

~ $ find some-file-criteria some-file-path | /

> xargs some-great-command-that-needs-filename-arguments

 

       然而,不要將 xargs 僅看作是 find 的輔助工具;它是一個未得到充分利用的工具之一,當您養成使用它的習慣時,將會希望進行所有試驗,包括以下用法。

 

7.1 傳遞空格分隔的列表

       在最簡單的調用形式中,xargs 就像一個篩選器,它接受一個列表(每個成員分別在單獨的行上)作爲輸入。該工具將那些成員放置在單個空格分隔的行上:


清單 14. xargs 工具產生的輸出示例

~ $ xargs

                a

                b

                c

                 Control-D

a b c

~ $

       您可以發送通過 xargs 來輸出文件名的任何工具的輸出,以便爲其他某些接受文件名作爲參數的工具獲得參數列表,如以下示例所示:


清單 15. xargs 工具的使用示例

~/tmp $ ls -1 | xargs

December_Report.pdf README a archive.tar mkdirhier.sh

~/tmp $ ls -1 | xargs file

December_Report.pdf: PDF document, version 1.3

README: ASCII text

a: directory

archive.tar: POSIX tar archive

mkdirhier.sh: Bourne shell script text executable

~/tmp $

 

       xargs 命令不只用於傳遞文件名。您還可以在需要將文本篩選到單個行中的任何時候使用它:


清單 16. 好習慣 7 的示例:使用 xargs 工具來將文本篩選到單個行中

~/tmp $ ls -l | xargs

-rw-r--r-- 7 joe joe 12043 Jan 27 20:36 December_Report.pdf -rw-r--r-- 1 /

root root 238 Dec 03 08:19 README drwxr-xr-x 38 joe joe 354082 Nov 02 /

16:07 a -rw-r--r-- 3 joe joe 5096 Dec 14 14:26 archive.tar -rwxr-xr-x 1 /

joe joe 3239 Sep 30 12:40 mkdirhier.sh

~/tmp $

 

7.2 謹慎使用 xargs

       從技術上講,使用 xargs 很少遇到麻煩。缺省情況下,文件結束字符串是下劃線 (_);如果將該字符作爲單個輸入參數來發送,則它之後的所有內容將被忽略。爲了防止這種情況發生,可以使用 -e 標誌,它在不帶參數的情況下完全禁用結束字符串。

 

8. 瞭解何時 grep 應該執行計數——何時應該繞過

       避免通過管道將 grep 發送到 wc -l 來對輸出行數計數。grep  -c 選項提供了對與特定模式匹配的行的計數,並且一般要比通過管道發送到 wc 更快,如以下示例所示:


清單 17. 好習慣 8 的示例:使用和不使用 grep 的行計數

~ $ time grep and tmp/a/longfile.txt | wc -l

2811

real    0m0.097s

user    0m0.006s

sys     0m0.032s

~ $ time grep -c and tmp/a/longfile.txt

2811

 

real    0m0.013s

user    0m0.006s

sys     0m0.005s

~ $

 

       除了速度因素外,-c 選項還是執行計數的好方法。對於多個文件,帶 -c 選項的 grep 返回每個文件的單獨計數,每行一個計數,而針對 wc 的管道則提供所有文件的組合總計數。

       然而,不管是否考慮速度,此示例都表明了另一個要避免地常見錯誤。這些計數方法僅提供包含匹配模式的行數——如果那就是您要查找的結果,這沒什麼問題。但是在行中具有某個特定模式的多個實例的情況下,這些方法無法爲您提供實際匹配實例數量 的真實計數。歸根結底,若要對實例計數,您還是要使用 wc 來計數。首先,使用 -o 選項(如果您的版本支持它的話)來運行 grep 命令。此選項僅 輸出匹配的模式,每行一個模式,而不輸出行本身。但是您不能將它與 -c 選項結合使用,因此要使用 wc -l 來對行計數,如以下示例所示:


清單 18. 好習慣 8 的示例:使用 grep 對模式實例計數

~ $ grep -o and tmp/a/longfile.txt | wc -l

3402

~ $

 

       在此例中,調用 wc 要比第二次調用 grep 並插入一個虛擬模式(例如 grep -c)來對行進行匹配和計數稍快一點。

 

9. 匹配輸出中的某些字段,而不只是對行進行匹配

       當您只希望匹配輸出行中特定字段 中的模式時,諸如 awk 等工具要優於 grep

       下面經過簡化的示例演示瞭如何僅列出 12 月修改過的文件。


清單 19. 壞習慣 9 的示例:使用 grep 來查找特定字段中的模式

~/tmp $ ls -l /tmp/a/b/c | grep Dec

-rw-r--r--  7 joe joe  12043 Jan 27 20:36 December_Report.pdf

-rw-r--r--  1 root root  238 Dec 03 08:19 README

-rw-r--r--  3 joe joe   5096 Dec 14 14:26 archive.tar

~/tmp $

 

       在此示例中,grep 對行進行篩選,並輸出其修改日期和名稱中帶 Dec 的所有文件。因此,諸如 December_Report.pdf 等文件是匹配的,即使它自從一月份以來還未修改過。這可能不是您希望的結果。爲了匹配特定字段中的模式,最好使用 awk,其中的一個關係運算符對確切的字段進行匹配,如以下示例所示:


清單 20. 好習慣 9 的示例:使用 awk 來查找特定字段中的模式

~/tmp $ ls -l | awk '$6 == "Dec"'

-rw-r--r--  3 joe joe   5096 Dec 14 14:26 archive.tar

-rw-r--r--  1 root root  238 Dec 03 08:19 README

~/tmp $

 

10. 停止對 cat 使用管道

       grep 的一個常見的基本用法錯誤是通過管道將 cat 的輸出發送到 grep 以搜索單個文件的內容。這絕對是不必要的,純粹是浪費時間,因爲諸如 grep 這樣的工具接受文件名作爲參數。您根本不需要在這種情況下使用 cat,如以下示例所示:


清單 21. 好習慣和壞習慣 10 的示例:使用帶和不帶 cat  grep

~ $ time cat tmp/a/longfile.txt | grep and

2811

 

real    0m0.015s

user    0m0.003s

sys     0m0.013s

~ $ time grep and tmp/a/longfile.txt

2811

real    0m0.010s

user    0m0.006s

sys     0m0.004s

~ $

 

       此錯誤存在於許多工具中。由於大多數工具都接受使用連字符 (-) 的標準輸入作爲一個參數,因此即使使用 cat 來分散 stdin 中的多個文件,參數也通常是無效的。僅當您使用帶多個篩選選項之一的 cat 時,才真正有必要在管道前首先執行連接。

 

11. 使用文件名完成

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

 

常用首字母縮寫詞

1)        MB:兆字節

2)        HTTP:超文本傳輸協議

3)        HTTPSHTTP over Secure Sockets Layer

4)        FTP:文件傳輸協議

5)        FTPSFTP over Secure Sockets Layer

6)        LDAP:輕型目錄訪問協議

 

我正在運行哪種 Shell

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


清單 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將完成文件名,或完成儘可能多的部分。例如,假設您擁有名爲 file1file2  file3 的文件。如果您鍵入 f,然後按 Esc 鍵,將填充 file,而您必須鍵入 1 來完成相應的文件名。

 

Bash

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

 

Korn Shell

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

 

12. 使用歷史擴展

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


清單 2. 使用 !$ 獲得前一個命令使用的文件名

$ grep pickles this-is-a-long-lunch-menu-file.txt

pastrami on rye with pickles and onions

$ vi !$   

 

13. 重用以前的參數

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


清單 3. 組合使用 !$  !:1

$ mv kxp12.c file_system_access.c

$ ln –s !$ !:1

 

14. 使用 pushd  popd 管理目錄導航

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


清單 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

 

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


清單 5. 旋轉目錄堆棧

$ dirs

/usr/local/bin /var /etc ~ ~

$ pushd +1

/var /etc ~ ~ /usr/local/bin

$ pushd -1

~ /usr/local/bin /var /etc ~

 

15. 查找大型文件

       是否需要找出您的所有空閒磁盤空間被什麼佔用了?您可以使用以下幾個工具來管理您的存儲設備。如清單 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 {}/;

 

16. 不使用編輯器創建臨時文件

       以下是一個簡單示例:您需要快速創建一個簡單臨時文件,但不希望啓動您的編輯器。使用帶有 文件重定向操作符的 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

 

17. 使用 curl 命令行實用工具

       curl 命令使您可以使用 HTTPHTTPSFTPFTPSGopherDICTTELNETLDAP  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 命令的完整使用信息,就可以開始瞭解更多內容。

18. 最有效地利用正則表達式

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


 1. 正則表達式序列

序列

說明

脫字符 (^)

匹配出現在行首的表達式,例如 ^A

美元符號 ($)

匹配出現在行末的表達式,例如 A$

反斜槓 (/)

取消下一個字符的特殊含義,例如 /^

方括號 ([])

匹配括起來的任一字符,例如 [aeiou](使用連字符 [-表示範圍,例如 [0-9])。

[^ ]

匹配除括起來字符以外的任一字符,例如 [^0-9]

句點 (.)

匹配除行尾之外的任意單個字符

星號 (*)

匹配零個或多個前驅字符或表達式

/{x,y/}

匹配出現過 x  y 個和前面相同的內容

/{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 部分:正則表達式。”

19. 確定當前用戶

       有時,您可能希望確定某個特定用戶是否運行過您的管理腳本。爲找出答案,您可以使用 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

 

20. 使用 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

 

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

 

 

 

From:

http://www.ibm.com/developerworks/cn/aix/library/au-badunixhabits.html

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章