<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-314  評論-209  文章-0  trackbacks-0
     不良的使用模式會降低您的速度,并且通常會導(dǎo)致意外錯誤。養(yǎng)成這些好習(xí)慣是加強您的 UNIX 命令行技能的積極步驟。

     

    Unix 下要采用的20個好習(xí)慣為:

    1)        在單個命令中創(chuàng)建目錄樹。

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

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

    4)        謹慎引用變量。

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

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

    7)        find 之外使用 xargs

    8)        了解何時 grep 應(yīng)該執(zhí)行計數(shù)——何時應(yīng)該繞過。

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

    10)    停止對 cat 使用管道。

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

    12)    使用歷史擴展。

    13)    重用以前的參數(shù)。

    14)    使用 pushd popd 管理目錄導(dǎo)航。

    15)    查找大型文件。

    16)    不使用編輯器創(chuàng)建臨時文件。

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

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

    19)    確定當(dāng)前用戶。

    20)    使用 awk 處理數(shù)據(jù)。

     

    1. 在單個命令中創(chuàng)建目錄樹

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

     

    清單 1. 壞習(xí)慣 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 選項并在單個命令中創(chuàng)建所有父目錄及其子目錄要容易得多。但是即使對于知道此選項的管理員,他們在命令行上創(chuàng)建子目錄時也仍然束縛于逐步創(chuàng)建每級子目錄。花時間有意識地養(yǎng)成這個好習(xí)慣是值得的.


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

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

     

           您可以使用此選項來創(chuàng)建整個復(fù)雜的目錄樹(在腳本中使用是非常理想的),而不只是創(chuàng)建簡單的層次結(jié)構(gòu)。


     
    清單 3. 好習(xí)慣 1 的另一個示例:使用一個命令來定義復(fù)雜的目錄樹

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

     

           過去,單獨定義目錄的唯一借口是您的 mkdir 實現(xiàn)不支持此選項,但是在大多數(shù)系統(tǒng)上不再是這樣了。IBMAIX®mkdirGNU mkdir 和其他遵守單一 UNIX 規(guī)范 (Single UNIX Specification) 的系統(tǒng)現(xiàn)在都具有此選項。

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

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

     

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

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


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

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

     

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

     

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

           您可能已經(jīng)知道,在大多數(shù) Shell 中,您可以在單個命令行上通過在命令之間放置一個分號 (;) 來組合命令。該分號是 Shell 控制操作符,雖然它對于在單個命令行上將離散的命令串聯(lián)起來很有用,但它并不適用于所有情況。例如,假設(shè)您使用分號來組合兩個命令,其中第二個命令的正確執(zhí)行完全依賴于第一個命令的成功完成。如果第一個命令未按您預(yù)期的那樣退出,第二個命令仍然會運行——結(jié)果會導(dǎo)致失敗。相反,應(yīng)該使用更適當(dāng)?shù)目刂撇僮鞣ū疚膶⒚枋銎渲械牟糠植僮鞣V灰?/span> Shell 支持它們,就值得養(yǎng)成使用它們的習(xí)慣。

     

    3.1 僅當(dāng)另一個命令返回零退出狀態(tài)時才運行某個命令

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


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

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

     

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

     

    3.2 僅當(dāng)另一個命令返回非零退出狀態(tài)時才運行某個命令

           類似地,|| 控制操作符分隔兩個命令,并且僅當(dāng)?shù)谝粋€命令返回非零退出狀態(tài)時才運行第二個命令。換句話說,如果第一個命令成功,則第二個命令不會運行。如果第一個命令失敗,則第二個命令才會 運行。在測試某個給定目錄是否存在時,通常使用此操作符,如果該目錄不存在,則創(chuàng)建它:


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

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

     

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


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

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

     

     

    4. 謹慎引用變量

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


    清單 8. 好習(xí)慣 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. 使用轉(zhuǎn)義序列來管理較長的輸入

           您或許看到過使用反斜杠 (/) 來將較長的行延續(xù)到下一行的代碼示例,并且您知道大多數(shù) Shell 都將您通過反斜杠聯(lián)接的后續(xù)行上鍵入的內(nèi)容視為單個長行。然而,您可能沒有在命令行中像通常那樣利用此功能。如果您的終端無法正確處理多行回繞,或者您的命令行比通常小(例如在提示符下有長路經(jīng)的時候),反斜杠就特別有用。反斜杠對于了解鍵入的長輸入行的含義也非常有用,如以下示例所示:


    清單 9. 好習(xí)慣 5 的示例:將反斜杠用于長輸入

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

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

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

     

    或者,也可以使用以下配置:
    清單 10. 好習(xí)慣 5 的替代示例:將反斜杠用于長輸入

    ~ $ cd tmp/a/b/c /

    >                 || /

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

    >                    && /

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

     

           然而,當(dāng)您將輸入行劃分到多行上時,Shell 始終將其視為單個連續(xù)的行,因為它總是刪除所有反斜杠和額外的空格。

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

     

    6. 在列表中對命令分組

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

     

    6.1 Subshell 中運行命令列表

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


    清單 11. 好習(xí)慣 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"

     

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

           當(dāng)您在命令列表中重新定義環(huán)境變量,并且您不希望將那些定義應(yīng)用于當(dāng)前 Shell 時,使用 Subshell 更可取。

     

    6.2 在當(dāng)前 Shell 中運行命令列表

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


    清單 12. 好習(xí)慣 6 的另一個示例:在當(dāng)前 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 上,后者然后使用該文件列表作為參數(shù)來運行其他某些有用的命令,如以下示例所示:


    清單 13. xargs 工具的經(jīng)典用法示例

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

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

     

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

     

    7.1 傳遞空格分隔的列表

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


    清單 14. xargs 工具產(chǎn)生的輸出示例

    ~ $ xargs

                    a

                    b

                    c

                     Control-D

    a b c

    ~ $

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


    清單 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. 好習(xí)慣 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

           從技術(shù)上講,使用 xargs 很少遇到麻煩。缺省情況下,文件結(jié)束字符串是下劃線 (_);如果將該字符作為單個輸入?yún)?shù)來發(fā)送,則它之后的所有內(nèi)容將被忽略。為了防止這種情況發(fā)生,可以使用 -e 標(biāo)志,它在不帶參數(shù)的情況下完全禁用結(jié)束字符串。

     

    8. 了解何時 grep 應(yīng)該執(zhí)行計數(shù)——何時應(yīng)該繞過

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


    清單 17. 好習(xí)慣 8 的示例:使用和不使用 grep 的行計數(shù)

    ~ $ 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 選項還是執(zhí)行計數(shù)的好方法。對于多個文件,帶 -c 選項的 grep 返回每個文件的單獨計數(shù),每行一個計數(shù),而針對 wc 的管道則提供所有文件的組合總計數(shù)。

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


    清單 18. 好習(xí)慣 8 的示例:使用 grep 對模式實例計數(shù)

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

    3402

    ~ $

     

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

     

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

           當(dāng)您只希望匹配輸出行中特定字段 中的模式時,諸如 awk 等工具要優(yōu)于 grep

           下面經(jīng)過簡化的示例演示了如何僅列出 12 月修改過的文件。


    清單 19. 壞習(xí)慣 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 等文件是匹配的,即使它自從一月份以來還未修改過。這可能不是您希望的結(jié)果。為了匹配特定字段中的模式,最好使用 awk,其中的一個關(guān)系運算符對確切的字段進行匹配,如以下示例所示:


    清單 20. 好習(xí)慣 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 的輸出發(fā)送到 grep 以搜索單個文件的內(nèi)容。這絕對是不必要的,純粹是浪費時間,因為諸如 grep 這樣的工具接受文件名作為參數(shù)。您根本不需要在這種情況下使用 cat,如以下示例所示:


    清單 21. 好習(xí)慣和壞習(xí)慣 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

    ~ $

     

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

     

    11. 使用文件名完成

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

     

    常用首字母縮寫詞

    1)        MB:兆字節(jié)

    2)        HTTP:超文本傳輸協(xié)議

    3)        HTTPSHTTP over Secure Sockets Layer

    4)        FTP:文件傳輸協(xié)議

    5)        FTPSFTP over Secure Sockets Layer

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

     

    我正在運行哪種 Shell

           如果您不知道目前使用的是哪一種 Shell,會怎么樣?雖然這個訣竅不是另外 10 個好習(xí)慣的正式組成部分,但它仍然很有用。可以使用 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 支持最直接文件名完成功能。設(shè)置 filec 變量可啟用該功能。(您可以使用命令 set filec。)在您開始鍵入文件名后,可以按 Esc 鍵,Shell 將完成文件名,或完成盡可能多的部分。例如,假設(shè)您擁有名為 file1file2 file3 的文件。如果您鍵入 f,然后按 Esc 鍵,將填充 file,而您必須鍵入 12 3 來完成相應(yīng)的文件名。

     

    Bash

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

     

    Korn Shell

           對于 Korn Shell 用戶,文件名完成取決于 EDITOR 變量的值。如果 EDITOR 設(shè)置為 vi,那么您鍵入部分名稱,然后按 Esc 鍵,后跟反斜杠 (/) 字符。如果 EDITOR 設(shè)置為 emacs,那么您鍵入部分名稱,然后按兩次 Esc 鍵以完成文件名。

     

    12. 使用歷史擴展

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


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

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

    pastrami on rye with pickles and onions

    $ vi !$   

     

    13. 重用以前的參數(shù)

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


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

    $ mv kxp12.c file_system_access.c

    $ ln –s !$ !:1

     

    14. 使用 pushd popd 管理目錄導(dǎo)航

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


    清單 4. 使用 pushd popd 在目錄樹中導(dǎo)航

    $ 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 命令還支持使用參數(shù)處理目錄堆棧。使用 +n -n 參數(shù),其中 n 是一個數(shù)字,您可以向左或向右移動堆棧,清單 5 所示。


    清單 5. 旋轉(zhuǎn)目錄堆棧

    $ dirs

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

    $ pushd +1

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

    $ pushd -1

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

     

    15. 查找大型文件

           是否需要找出您的所有空閑磁盤空間被什么占用了?您可以使用以下幾個工具來管理您的存儲設(shè)備。如清單 6 所示,df 命令為您顯示每個可用卷上已使用的塊的總數(shù),以及空閑空間的百分比。


    清單 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 參數(shù)。清單 7 顯示了如何使用 find 命令來查找大于 10MB 的文件。請注意,-size 參數(shù)以 KB 為單位計量大小。


    清單 7. 查找大于 10MB 的所有文件

    $ find / -size +10000k –xdev –exec ls –lh {}/;

     

    16. 不使用編輯器創(chuàng)建臨時文件

           以下是一個簡單示例:您需要快速創(chuàng)建一個簡單臨時文件,但不希望啟動您的編輯器。使用帶有 > 文件重定向操作符的 cat 命令。如清單 8 所示,使用不帶文件名的 cat 命令只回顯向標(biāo)準(zhǔn)輸入鍵入的任何內(nèi)容;> 重定向?qū)⒃撦斎氩东@到指定的文件中。請注意,您在結(jié)束鍵入時必須提供文件結(jié)束字符,通常為 Ctrl-D


    清單 8. 快速創(chuàng)建臨時文件

    $ cat > my_temp_file.txt

    This is my temp file text

    ^D

    $ cat my_temp_file.txt

    This is my temp file text

     

           需要執(zhí)行相同操作,但是附加到現(xiàn)有文件而不是創(chuàng)建新文件。如清單 9 所示,改用 >> 操作符。>> 文件重定向操作符向現(xiàn)有文件附加內(nèi)容。


    清單 9.快速向文件附加內(nèi)容

    $ 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 協(xié)議從服務(wù)器檢索數(shù)據(jù)。如清單 10 所示,我可以使用 curl 命令從美國國家氣象局了解我所在位置(紐約州布法羅市)的當(dāng)前天氣狀況。當(dāng)與 grep 命令組合使用時,我可以檢索布法羅市的天氣狀況。使用 -s 命令行選項來禁止 curl 處理輸出。


    清單 10. 使用 curl 檢索當(dāng)前天氣狀況

    $ curl –s http://www.srh.noaa.gov/data/ALY/RWRALY | grep BUFFALO

    BUFFALO        MOSUNNY   43 22 43 NE13      30.10R

     

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


    清單 11. 使用 curl 下載 HTTP 承載的文件

    $ curl -o archive.tar http://www.somesite.com/archive.tar

     

           這實際上只是您使用 curl 命令可以完成的操作的提示。您只需在命令提示符處鍵入 man curl 顯示 curl 命令的完整使用信息,就可以開始了解更多內(nèi)容。

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

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


    1. 正則表達式序列

    序列

    說明

    脫字符 (^)

    匹配出現(xiàn)在行首的表達式,例如 ^A

    美元符號 ($)

    匹配出現(xiàn)在行末的表達式,例如 A$

    反斜杠 (/)

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

    方括號 ([])

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

    [^ ]

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

    句點 (.)

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

    星號 (*)

    匹配零個或多個前驅(qū)字符或表達式

    /{x,y/}

    匹配出現(xiàn)過 x y 個和前面相同的內(nèi)容

    /{x/}

    精確匹配出現(xiàn)過 x 個和前面相同的內(nèi)容

    /{x,/}

    匹配出現(xiàn)過 x 個或更多和前面相同的內(nèi)容

     

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

     

           有關(guān)命令行正則表達式的深入描述,閱讀 developerWorks 文章“對話 UNIX,第 9 部分:正則表達式。”

    19. 確定當(dāng)前用戶

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


    清單 13. 從命令行使用 whoami

    $ whoami

    John


    清單 14. 在腳本中使用 whoami

    if [ $(whoami) = "root" ]

    then

       echo "You cannot run this script as root."

       exit 1

    fi

     

    20. 使用 awk 處理數(shù)據(jù)

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


    清單 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 任務(wù)。在清單 16 中,sales 文件包含每個銷售人員的姓名,后跟每月銷售數(shù)字。您可以使用 awk 命令來快速獲得每個月的銷售總額。缺省情況下,awk 將每個以逗號分隔的值視為不同的字段。您使用 $n 操作符來訪問每個字段。


    清單 16. 使用 awk 對數(shù)據(jù)進行匯總

    $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

     

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

     

     

     

    From:

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

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

     

    posted on 2011-07-18 18:51 xzc 閱讀(622) 評論(0)  編輯  收藏 所屬分類: linux/unix
    主站蜘蛛池模板: 亚洲最大黄色网址| 免费人成在线观看网站品爱网 | 日本一区午夜艳熟免费| 视频一区二区三区免费观看| 亚洲精品无码av中文字幕| 亚洲欧美日韩一区二区三区 | 亚洲AⅤ视频一区二区三区| 日韩免费毛片视频| 国产一级淫片a免费播放口之 | 亚洲视频在线观看免费| 亚洲精品高清视频| 亚洲综合男人的天堂色婷婷| 亚洲视频精品在线观看| 亚洲午夜精品在线| 亚洲综合国产成人丁香五月激情 | 亚洲沟沟美女亚洲沟沟| 亚洲妇女水蜜桃av网网站| 亚洲中文字幕日本无线码| 亚洲午夜理论片在线观看| 国产精品观看在线亚洲人成网| 国产亚洲福利精品一区二区| caoporm超免费公开视频| 国产性生大片免费观看性| 伊人久久免费视频| 97在线观免费视频观看| 国产精品国产自线拍免费软件| 亚洲国产日韩在线观频| 亚洲成av人在线视| 亚洲人成网站18禁止久久影院| 亚洲欧美黑人猛交群| 亚洲精品国产日韩无码AV永久免费网 | 在线观看亚洲电影| 一区二区免费电影| 久久免费观看国产精品88av| 国产精品视频免费观看| 日本高清免费网站| 亚洲香蕉成人AV网站在线观看| 久久精品国产亚洲AV无码偷窥| 亚洲精品伊人久久久久| 日韩毛片免费一二三| 亚洲高清成人一区二区三区|