鸟哥的Linux私房菜-第10/11/12/13章(vim程序编辑器、学习bash、正则表达式与文件格式化处理、学习Shell Scripts)...
第10章 vim程序編輯器
可以將vim看做vi的進(jìn)階版本,vim可以用顏色或底線等方式來顯示出一些特殊的信息。
為何要學(xué)習(xí)vim?因為:
a. 所有的 Unix Like 系統(tǒng)都會內(nèi)建 vi 文書編輯器,其他的文書編輯器則不一定會存在;
b. 很多個別軟件的編輯接口都會主動呼叫 vi (例如未來會談到的 crontab, visudo, edquota 等指令);
c. vim 具有程序編輯的能力,可以主動的以字體顏色辨別語法的正確性,方便程序設(shè)計;
d. 因為程序簡單,編輯速度相當(dāng)快速。
vi的使用
vi的三種模式:一般模式、編輯模式、指令列命令模式。
按鍵說明
第一部分:一般模式可用的按鈕說明,光標(biāo)移動、復(fù)制貼上、搜尋取代等
第二部分:一般模式切換到編輯模式的可用按鍵說明
?
第三部分:一般模式切換到指令列模式的可用按鍵說明
注意:在 vi 中,數(shù)字很有意義。數(shù)字通常代表重復(fù)做幾次,也可能代表去到第幾行。
vim 的暫存檔、救援回復(fù)與開啟時的警告信息
當(dāng)我們在使用 vim 編輯時, vim 會在與被編輯的檔案的目錄下,再建立一個名為 .filename.swp 檔案。 比如,編輯 /tmp/vitest/man.config 這個檔案時, vim 會主動的建立/tmp/vitest/.man.config.swp 暫存檔,你對 man.config 做的動作就會被記錄到這個 .man.config.swp 當(dāng)中。如果你的系統(tǒng)因為某些原因斷線了, 導(dǎo)致你編輯的檔案還沒有儲存,這個時候 .man.config.swp 就能夠發(fā)揮救援的功能。
由與暫存盤存在的關(guān)系,因此 vim 會主動判斷你的這個檔案可能有些問題,在上面的圖示中 vim 提示兩點主要的問題與解決方案,分別是這樣的:
問題一:可能有其他人或程序同時在編輯這個檔案:
由與 Linux 是多人多任務(wù)的環(huán)境,因此很可能有很多人同時在編輯同一個檔案。如果在多人共同編輯的情況下, 萬一大家同時儲存,那么這個檔案的內(nèi)容將會變的亂七八糟!為了避免這個問題,因此 vim 會出現(xiàn)這個警告窗口! 解決的方法則是:
a. 找到另外那個程序或人員,請他將該 vim 的工作結(jié)束,然后你再繼續(xù)處理。
b. 如果你只是要看該檔案的內(nèi)容并的會有任何修改編輯癿行為,那么可以選擇開啟成為只讀(O)檔案, 亦即上述畫面反白部分輸入英文『 o 』即可,其實就是 [O]pen Read-Only癿選項啦!
問題二:在前一個 vim 癿環(huán)境中,可能因為某些丌知名原因?qū)е?vim 中斷 (crashed):
這就是常見的不正常結(jié)束 vim 產(chǎn)生的后果。解決方案依據(jù)吧同癿情況而不同喔!常見的處理方法為:
a. 如果你之前的 vim 處理動作尚未儲存,此時你應(yīng)該要按下『R』,亦即使用 (R)ecover 的項目, 此時 vim 會載入 .man.config.swp 的內(nèi)容,讓你自己來決定要不要儲存!這樣就能夠救回來你之前未儲存的工作。 不過那個 .man.config.swp 并不會在你結(jié)束 vim 后自動刪除,所以你離開 vim 后還得要自行刪除 .man.config.swp 才能避免每次打開這個檔案都會出現(xiàn)這樣的警告!
b. 如果你確定這個暫存盤是沒有用的,那么你可以直接按下『D』刪除掉這個暫存盤,亦即(D)elete it 這個項目即可。 此時 vim 會載入 man.config ,并且將舊的 .man.config.swp 刪除后,建立這次會使用新的 .man.config.swp 喔!
至與這個發(fā)現(xiàn)暫存盤警告訊息的畫面中,有出現(xiàn)六個可用按鈕,各按鈕的說明如下:
a. ?[O]pen Read-Only:打開此檔案成為只讀檔, 可以用在你只是想要查閱該檔案內(nèi)容并不想要進(jìn)行編輯行為時。一般來說,在上課時,如果你是登入到同學(xué)的計算機(jī)去看他的配置文件, 結(jié)果發(fā)現(xiàn)其實同學(xué)他自己也在編輯時,可以使用這個模式;
b. (E)dit anyway:還是用正常的方式打開你要編輯的那個檔案, 并布會載入暫存盤的內(nèi)容。不過很容易出現(xiàn)兩個使用者互相改變對方的檔案等問題!不好不好!
c.?(R)ecover:就是加載暫存盤的內(nèi)容,用在你要救回之前未儲存的工作。 不過當(dāng)你救回來并且儲存離開 vim 后,還是要手動自行刪除那個暫存檔喔!
d.?(D)elete it:你確定那個暫存檔是無用的!那么開啟檔案前會先將這個暫存盤刪除! 這個動作其實是比較常做的!因為你可能不確定這個暫存檔是怎么來的,所以就刪除掉他吧!哈哈!
e. (Q)uit:按下 q 就離開 vim ,不會進(jìn)行任何動作回到命令提示字符。
f.?(A)bort:忽略這個編輯行為,感覺上與 quit 非常類似! 也會送你回到命令提示字符就是啰!
vim 的額外功能
區(qū)塊選擇(Visual Block)
多文檔編輯
vim 后面同時接多個檔案同時開啟。相關(guān)按鍵:
多窗口功能
?
vim 環(huán)境設(shè)定與記錄:~/.vimrc, ~/.viminfo
在 vim 做過的動作都會被記錄在 ~/.viminfo 這個檔案中。
vim 的環(huán)境設(shè)定參數(shù)有很多,如果你想要知道目前的設(shè)定值,可以在一般模式時輸入【:set all】查詢。常用的設(shè)定值:
我們可以透過配置文件來直接規(guī)定我們習(xí)慣的 vim 操作環(huán)境呢! 整體 vim 的設(shè)定值一般是放置在 /etc/vimrc 這個檔案,不過,不建議你修改他! 你可以修改 ~/.vimrc 這個檔案(預(yù)設(shè)不存在,請你自行手動建立!),將你所希望的設(shè)定值寫入! 舉例來說,可以是這樣的一個檔案:
?
vim 常用指令示意圖
?
其他 vim 使用注意事項
中文編碼問題
1. 你的 Linux 系統(tǒng)默人支持的語系數(shù)據(jù):這與 /etc/sysconfig/i18n 有關(guān);
2. 你的終端界面 (bash) 的語系: 這與 LANG 這個變量有關(guān);
3. 你的檔案原本的編碼;
4. 開啟終端機(jī)癿的軟件,例如在 GNOME 底下的窗口接口。
事實上最重要的是上面的第三和第四點,只要這兩點的編碼一致,你就能夠正確的看到與編輯你的中文檔案。 否則就會看到一堆亂碼啦!
?
DOS 與 Linux 的斷行字符
DOS 與 Linux 斷行字符的不同。 我們也可以利用 cat -A 來觀察以 DOS (Windows 系統(tǒng)) 建立的檔案的特殊格式, 也可以發(fā)現(xiàn)在 DOS 使用的斷行字
符為 ^M$ ,我們稱為 CR 與 LF 兩個符號。 而在 Linux 底下,則是僅有 LF ($) 這個斷行符號。這個斷行符號對與 Linux 的影響很大喔!
在 Linux 底下的指令在開始執(zhí)行時,他的判斷依據(jù)是 『Enter』,而 Linux 的 Enter 為 LF符號, 不過,由與 DOS 的斷行符號是 CRLF ,也就是多了一個 ^M 的符號出來, 在這樣的情況下,如果是一個 shell script 的程序檔案,將可能造成『程序無法執(zhí)行』的狀態(tài), 因為他會誤判程序所下達(dá)的指令內(nèi)容啊。
那則么辦啊?很簡單啊,將格式轉(zhuǎn)換成為 Linux 即可。
如果在不同系統(tǒng)之間復(fù)制一些純文本檔案時,千萬記得要使用 unix2dos 或 dos2unix 來轉(zhuǎn)換一下斷行格式。
?
eg: unix2dos -k man.config 將man.config修改成dos斷行
dos2unix -k man.config man.config.linux 將man.config轉(zhuǎn)成man.config.linux斷行字符
語系編碼轉(zhuǎn)換
第11章 學(xué)習(xí) bash
認(rèn)識 bash 這個 shell
管理整個計算機(jī)硬件的其實是操作系統(tǒng)的核心 (kernel),這個核心是需要被保護(hù)的! 所以我們一般使用者就只能透過 shell 來跟核心溝通,以讓核心達(dá)到我們所想要達(dá)到的工作。 那么系統(tǒng)有多少 shell 可用呢?為什么我們要使用 bash 啊?
硬件、核心與 shell
其實殼程序的功能只是提供用戶操作系統(tǒng)的一個接口,因此這個殼程序需要可以呼叫其他軟件才好。 我們學(xué)過很多指令,包括 man, chmod, chown, vi, fdisk, mkfs 等等指令,這些指令都是獨立的應(yīng)用程序, 但是我們可以透過殼程序 (就是指令列模式) 來操作這些應(yīng)用程序,讓這些應(yīng)用程序呼叫核心來運作所需的工作。
為何要學(xué)文字接口的 shell ?
文字接口的 shell :幾乎各家 distributions 使用的bash都是一樣的;
遠(yuǎn)程管理:文字接口比較快;
Linux 的任督二脈: shell 是也!
系統(tǒng)的合法 shell 與 /etc/shells 功能
目前我們的 Linux (以 CentOS 5.x 為例) 有多少我們可以使用的 shells 呢? 你可以檢查一下
/etc/shells 這個檔案,至少就有底下這幾個可以用的 shells:
/bin/sh (已經(jīng)被 /bin/bash 所取代)
?/bin/bash (就是 Linux 預(yù)設(shè)的 shell)
?/bin/ksh (Kornshell 由 AT&T Bell lab. 發(fā)展出來的,兼容與 bash)
?/bin/tcsh (整合 C Shell ,提供更多的功能)
?/bin/csh (已經(jīng)被 /bin/tcsh 所取代)
?/bin/zsh (基于 ksh 發(fā)展出來的,功能更強(qiáng)大的 shell)
為什么我們系統(tǒng)上合法的 shell 要寫入 /etc/shells 這個檔案啊? 這是因為系統(tǒng)某些朋務(wù)在運作過程中,會去檢查使用者能夠使用的 shells ,而這些 shell 的查詢就是藉由 /etc/shells 這個檔案啰!
登入取得的 shell 記錄在 /etc/passwd 這個檔案中。
bash shell 的功能
命令編修能力(history):
bash 的功能里頭,相當(dāng)棒的一個就是『他能記憶使用過的指令!』
因為我只要在指令列按『上下鍵』就可以找到前/后一個輸入的指令!而在很多 distribution 里頭,默認(rèn)的指令記憶功能可以到達(dá) 1000 個!也就是說, 你曾經(jīng)下達(dá)過的指令幾乎都被記錄下來了。
這么多的指令記錄在哪里呢?在你的家目錄內(nèi)的 .bash_history 啦! 不過,需要留意的是,~/.bash_history 記錄的是前一次登入以前所執(zhí)行過的指令, 而至于這一次登入所執(zhí)行的指令都被暫存在內(nèi)存中,當(dāng)你成功注銷系統(tǒng)后,該指令記憶才會記錄到 .bash_history 當(dāng)中!
命令與檔案補(bǔ)全功能: ([tab] 按鍵的好處)
【tab】這個按鍵的功能就是在 bash 里面才有。
命令別名設(shè)定功能:alias
工作控制、前景背景控制: (job control, foreground, background)
程序腳本化:shell scripts
通配符:Wildcard
bash shell 的內(nèi)建命令:type
為了方便 shell 操作,bash已經(jīng)內(nèi)建了很多指令,比如 cd, umask等。
?那我怎么知道這個指令是來自外部指令(指的是其他非 bash 所提供得指令) 或是內(nèi)建在 bash 當(dāng)中的呢?
指令的下達(dá)
shell 的變量功能
什么是變量
什么是『變量』呢?簡單的說,就是讓某一個特定字符串代表不固定的內(nèi)容就是了。
最大的好處就是『方便!』:
變量的可變性與方便性;
影響 bash 環(huán)境操作的變量;
腳本程序設(shè)計(shell script)的好幫手
變量的取用與設(shè)定:echo,變量設(shè)定規(guī)則,unset
變量的取用:echo
變量的設(shè)定規(guī)則
1. 變量與變量內(nèi)容以一個等號『=』來連結(jié),如下所示:
『myname=VBird』
2. 等號兩邊不能直接接空格符,如下所示為錯誤:
『myname = VBird』或『myname=VBird Tsai』
3. 變量名稱只能是英文字母與數(shù)字,但是開頭字符不能是數(shù)字,如下為錯誤:
『2myname=VBird』
4. 變量內(nèi)容若有空格符可使用雙引號『"』或單引號『'』將發(fā)量內(nèi)容結(jié)合起來,但雙引號內(nèi)的特殊字符如 $ 等,可以保有原本的特性,如下所示:
『var="lang is $LANG"』則『echo $var』可得『lang is en_US』
單引號內(nèi)的特殊字符則僅為一般字符 (純文本),如下所示:
『var='lang is $LANG'』則『echo $var』可得『lang is $LANG』
5. 可用跳脫字符『 \ 』將特殊符號(如 [Enter], $, \, 空格符, '等)變成一般字符;
6. 在一串指令中,還需要藉由其他的指令提供的信息,可以使用反單引號『`指令`』或 『$(指令)』。特別注意,那個 ` 是鍵盤上方的數(shù)字鍵 1 左邊那個按鍵,而不是單引號! 例如想要取得核心版本的設(shè)定:
『version=$(uname -r)』再『echo $version』可得『2.6.18-128.el5』
7. 若該變量為擴(kuò)增變量內(nèi)容時,則可用 "$發(fā)量名稱" 或 ${變量} 累加內(nèi)容,如下所示:
『PATH="$PATH":/home/bin』
8. 若該發(fā)變量需要在其他子程序執(zhí)行,則需要以 export 來使變量變成環(huán)境變量:
『export PATH』
9. 通常大寫字符為系統(tǒng)默認(rèn)變量,自行設(shè)定變量可以使用小寫字符,方便判斷 (純粹依照使用者興趣與嗜好) ;
10. 取消變量的方法為使用 unset :『unset 變量名稱』例如取消 myname 的設(shè)定:
『unset myname』
舉例:
什么是『子程序』呢?就是說,在我目前這個 shell 的情況下,去啟用另一個新的 shell ,新的那個shell 就是子程序啦!在一般的狀態(tài)下,父程序的自定義變量是無法在子程序內(nèi)使用的。但是透過export 將變量變成環(huán)境變量后,就能夠在子程序底下應(yīng)用了!
環(huán)境變量的功能
環(huán)境變量可以幫我們達(dá)到很多功能~包括家目錄的變換啊、提示字符的顯示啊、執(zhí)行文件搜尋的路徑等。
目前我的shell 環(huán)境中, 有多少默認(rèn)的環(huán)境變量啊?我們可以到用兩個指令來查閱,分別是 env 與 export 呢!
用 env 觀察環(huán)境變量與常見環(huán)境變量說明
上面這些變量有些什么功用呢?底下我們就一個一個來分析:
? HOME
代表用戶的家目錄。還記得我們可以使用 cd ~ 去到自己的家目錄嗎?或者利用 cd 就可以直接回到用戶家目錄了。那就是取用這個變量啦~ 有很多程序都可能會取用動這個變量的值!
? SHELL
告知我們,目前這個環(huán)境使用的 SHELL 是哪支程序? Linux 預(yù)設(shè)使用 /bin/bash 的啦!
? HISTSIZE
這個與『歷史命令』有關(guān),亦即是, 我們曾經(jīng)下達(dá)過的指令可以被系統(tǒng)記錄下來,而記錄的『筆數(shù)』則是由這個值來設(shè)定的。
? MAIL
當(dāng)我們使用 mail 這個指令在收信時,系統(tǒng)會去讀取得郵件信箱檔案 (mailbox)。
? PATH
就是執(zhí)行文件搜尋的路徑啦~目錄與目錄中間以冒號(:)分割, 由于檔案的搜尋是依序由 PATH 的變量內(nèi)的目錄來查詢,所以,目錄的順序也是重要的喔。
? LANG
這個重要!就是語系數(shù)據(jù)啰~徆多訊息都會用到他, 舉例來說,當(dāng)我們在啟動某些 perl 的程序語言檔案時,他會主動的去分析語系數(shù)據(jù)文件, 如果發(fā)現(xiàn)有他無法解析的編碼語系,可能會產(chǎn)生錯誤喔!一般來說,我們中文編碼通常是 zh_TW.Big5 或者是 zh_TW.UTF-8,這兩個編碼偏偏不容易被解譯出來,所以,有的時候,可能需要修訂一下語系數(shù)據(jù)。
? RANDOM
這個玩意兒就是『隨機(jī)隨機(jī)數(shù)』的發(fā)量啦!目前大多數(shù)的 distributions 都會有隨機(jī)數(shù)生成器,那就是 /dev/random 這個檔案。 我們可以透過這個隨機(jī)數(shù)檔案相關(guān)的變量 ($RANDOM) 來隨機(jī)取得隨機(jī)數(shù)值喔。在 BASH 癿環(huán)境下,這個 RANDOM 變量的內(nèi)容,介于 0~32767 之間,所以,你只要 echo $RANDOM 時,系統(tǒng)就會主勱動的隨機(jī)取出一個介于 0~32767 的數(shù)值。萬一我想要使用 0~9 之間的數(shù)值呢?呵呵~利用 declare 宣告數(shù)值類型, 然后這樣做就可以了:
用 set 觀察所有變量 (含環(huán)境變量和自定義變量)
bash 可不止有環(huán)境變量,還有一些與 bash 操作接口有的變發(fā)量,以及用戶自己定義的變量存在。那么這些變量如何觀察呢?這個時候就得要使用 set 這個指令了。 set 除了環(huán)境變量之外, 還會將其他在 bash 內(nèi)的變量通通顯示出來。信息很多,僅列出幾個重要的內(nèi)容:
一般來說,不論是否為環(huán)境變量,只要跟我們目前這個 shell 的操作接口有關(guān)的變量, 通常都會被設(shè)定為大寫字符,也就是說,『基本上,在 Linux 預(yù)設(shè)的情況中,使用{大寫的字母}來設(shè)定的變量一般為系統(tǒng)內(nèi)定需要的變量』。有哪些是比較重要的?
PS1:提示字符的設(shè)定
$:關(guān)于本 shell 的PID
?:關(guān)于上個執(zhí)行指令的回傳值
OSTYPE, HOSTTYPE, MACHTYPE:主機(jī)硬件與核心的等級
export:自定義變量轉(zhuǎn)成環(huán)境變量
環(huán)境變量與自定義變量的區(qū)別:該變量是否會被子程序繼續(xù)引用。子程序僅會繼承父程序的環(huán)境變量,不會繼承自定義變量。
登入Linux并取得一個 bash 后,bash 就是一支獨立的程序,被稱為PID的就是。接下來你在這個 bash 底下所下達(dá)的任何指令都是由這個 bash 所衍生出來的,那些被下達(dá)的指令 就稱為子程序。
把自定義變量變成環(huán)境變量:語法:export 變量名稱
影響顯示結(jié)果的語系變量(locale)
查詢linux支持的語系(/usr/lib/locale):
修訂編碼:
系統(tǒng)默認(rèn)的語系定義在:/etc/sysconfig/i18n
變量的有效范圍
為什么環(huán)境變量的數(shù)據(jù)可以被子程序所引用呢?這是因為內(nèi)存配置的關(guān)系!理論上是這樣的:
?當(dāng)啟動一個 shell,操作系統(tǒng)會分配一記憶區(qū)塊給 shell 使用,此內(nèi)存內(nèi)變量可讓子程序取用
?若在父程序用 export 功能,可以讓自定義變量的內(nèi)容寫到上述的記憶區(qū)塊當(dāng)中(環(huán)境變量);
當(dāng)加載另一個 shell 時 (亦即啟動子程序,而離開原本的父程序了),子 shell 可以將父 shell 的環(huán)境變量所在的記憶區(qū)塊導(dǎo)入自己的環(huán)境發(fā)量區(qū)塊當(dāng)中
變量鍵盤讀取、數(shù)組與宣告:read, array, declare
read:讀取來至鍵盤輸入的變量
declare/typeset
declare 或 typeset 是一樣的功能,就是在『宣告變量的類型』。如果使用 declare 后面并沒有接任何參數(shù),那么 bash 就會主動的將所有的變量名稱與內(nèi)容通通叫出來,就好像使用 set 一樣。
如果你不小心將變量設(shè)定為『只讀』,通常得要注銷再登入才能復(fù)原該變量的類型。
數(shù)組(array)變量類型
在 bash 里面,數(shù)組的設(shè)定方式:arrayName[index]=content
與文件系統(tǒng)及程序的限制關(guān)系:ulimit
我們的 bash 是可以『限制用戶的某些系統(tǒng)資源』癿,包括可以開啟的檔案數(shù)量, 可以使用的 CPU時間,可以使用的內(nèi)存總量等等。如何設(shè)定?用 ulimit 吧!
變量內(nèi)容的刪除、取代與替換
變量內(nèi)容的刪除與取代
變量的測試與內(nèi)容替換
命令別名與歷史命令:
命令別名設(shè)定:alias, unalias
歷史命令:history
bash shell 的操作環(huán)境:
路徑與指令搜尋順序
bash 的進(jìn)站與歡迎信息:/etc/issue, /etc/motd
bash 的環(huán)境配置文件
終端機(jī)的環(huán)境設(shè)定:stty, set
通配符與特殊符號
數(shù)據(jù)流重導(dǎo)向
數(shù)據(jù)流重導(dǎo)向就是將某個指令執(zhí)行后應(yīng)該要出現(xiàn)在屏幕上的數(shù)據(jù),傳遞到其他地方。
什么是數(shù)據(jù)流重導(dǎo)向?
簡單的說,標(biāo)準(zhǔn)輸出指的是『指令執(zhí)行所回傳的正確的訊息』,而標(biāo)準(zhǔn)錯誤輸出可理解為『 指令執(zhí)行失敗后,所回傳的錯誤訊息』。
standard output 與 standard error output
數(shù)據(jù)流重導(dǎo)向可以將 standard output(簡稱 stdout) 與 standard error output (簡稱 stderr) 分別傳送到其他的檔案或裝置去,而分別傳送所用的特殊字符則如下所示:
1. 標(biāo)準(zhǔn)輸入 (stdin) :代碼為 0 ,使用 < 或<< ;
2. 標(biāo)準(zhǔn)輸出 (stdout):代碼為 1 ,使用 > 或 >> ;
3. 標(biāo)準(zhǔn)錯諢輸出(stderr):代碼為 2 ,使用 2> 或 2>> ;
?1> :以覆蓋的方法將『正確的數(shù)據(jù)』輸出到指定的檔案或裝置上;
?1>>:以累加的方法將『正確的數(shù)據(jù)』輸出到指定的檔案或裝置上;
?2> :以覆蓋的方法將『錯誤的數(shù)據(jù)』輸出到指定的檔案或裝置上;
?2>>:以累加的方法將『錯誤的數(shù)據(jù)』輸出到指定的檔案或裝置上;
/dev/null 垃圾桶黑洞裝置與特殊寫法
如果我知道錯誤訊息會發(fā)生,所以要將錯誤訊息忽略掉而并顯示或儲存呢? 這個時候黑洞裝置 /dev/null 就很重要了!這個 /dev/null 可以吃掉任何導(dǎo)向這個裝置的信息
如果我要將正確與錯誤數(shù)據(jù)通通寫入同一個檔案去呢?這個時候就得要使用特殊的寫法了! 我們同樣用底下的案例來說明:
standard input:< 與 <<
<:將原本需要由鍵盤輸入的數(shù)據(jù),改由檔案內(nèi)容取代。
?
<<:結(jié)束的輸入字符。
?為何要使用命令輸出重導(dǎo)向?
?屏幕輸出的信息很重要,而且我們需要將他存下來的時候;
?背景執(zhí)行中的程序,并希望他干擾屏幕正常的輸出結(jié)果時;
?一些系統(tǒng)的例行命令 (例如寫在 /etc/crontab 中的檔案) 的執(zhí)行結(jié)果,希望他可以存下來時;
?一些執(zhí)行命令的可能已知錯誤訊息時,想以『 2> /dev/null 』將他丟掉時;
?錯誤訊息與正確訊息需要分別輸出時。
命令執(zhí)行的判斷依據(jù): ;, &&, ll
管線命令(pipe)
bash 命令執(zhí)行時有輸出數(shù)據(jù)出現(xiàn),如果輸出的數(shù)據(jù)需要經(jīng)過幾道手續(xù)后才能得到我們想要的格式,應(yīng)該如何設(shè)定呢?這就牽涉到管線命令,管線命令使用【|】界定符號。
如果我們想知道 /etc 下有多少檔案,可以用 ls /etc 來查詢,不過因為檔案太多,一下把屏幕塞滿了,不知道前面輸出的內(nèi)容,此時,可以使用 less 協(xié)助:ls -al /etc | less
管線命令只能處理由前面一個指令傳來的正確信息,也就是 standard output 的信息,對于 standard error 并沒有直接處理的能力。
每個管線后面接的第一個數(shù)據(jù)必定是指令,而且這個指令必須能夠接受 standard input 的數(shù)據(jù)才行,這樣的指令來可以是管線命令,例如less, more, head, tail等。
擷取命令:cut, grep
什么是擷取命令:講一段數(shù)據(jù)經(jīng)過分析后,取出我們想要的。或者經(jīng)由分析關(guān)鍵詞,取出我們想要的哪一行。一般來說,擷取信息通常是針對一行一行來分析的。
cat:將一段信息的某一段切出來,處理信息以行為單位
grep:分析一行信息,若當(dāng)中有我們需要的信息,就將該行拿出來
?
排序命令:sort, wc, uniq
sort
uniq
如果我排序完成了,想要將重復(fù)的資料僅列出一個顯示,可以怎么做呢?
wc
?
雙向重導(dǎo)向:tee
tee 會同時將數(shù)據(jù)流分送到檔案去與屏幕 (screen);而輸出到屏幕的,其實就是 stdout ,可以讓下個指令繼續(xù)處理喔!
字符轉(zhuǎn)換命令:tr, col, join, paste, expand
tr 可以用來刪除一段訊息當(dāng)中的文字,或者是進(jìn)行文字訊息的替換!
col
join
paste
expand
分割命令:split
參數(shù)代換:xargs
xargs 可以讀入 stdin 的數(shù)據(jù),并且以空格符或斷行字符作為分辨,將 stdin 的資料分割成為 arguments 。 因為是以空格符作為分割,所以,如果有一些檔名或者是其他意義的名詞內(nèi)含有空格符的時候, xargs 可能就會誤判了
會使用 xargs 的原因是, 很多指令其實并不支持管線命令,因此我們可以透過 xargs 來提供該指令引用 standard input !舉例說:
關(guān)于減號 - 的用途
在管線命令當(dāng)中,常常會使用到前一個指令的 stdout 作為這次的stdin , 某些指令需要用到文件名 (例如 tar) 來進(jìn)行處理時,該 stdin 與 stdout 可以利用減號 "-" 來替
代, 舉例來說:
上面這個例子是說:『我將 /home 里面的檔案給他打包,但打包的數(shù)據(jù)不是記錄到檔案,而是傳送別stdout; 經(jīng)過管線后,將 tar -cvf - /home 傳送給后面的 tar -xvf - 』。后面的這個 - 則是取用前一個指令的 stdout, 因此,我們就不需要使用 file 了!這是很常見的例子喔!注意注意!
第13章 學(xué)習(xí) shell script
什么是 shell script?
shell script 是針對 shell 編寫的腳本。shell script 是利用shell的功能編寫的一個程序,這個程序使用純文本文件,將一些shell的語法與指令(含外部指令)寫在里面,搭配正則表達(dá)式、管線命令和數(shù)據(jù)流重定向等功能,以達(dá)到我們想要的處理目的。
為什么要學(xué)習(xí) shell script?
自動化管理的重要依據(jù)
追蹤與管理系統(tǒng)的重要工作
簡單入侵檢測功能
連續(xù)指令單一化
簡易的數(shù)據(jù)處理
跨平臺支持與學(xué)習(xí)歷程較短
第一支 script 的編寫與執(zhí)行
編寫 shell script 的注意事項:
a. 指令的執(zhí)行是從上而下、從左而右的分析與執(zhí)行;
b.?指令、選項與參數(shù)間的多個空白都會被忽略掉;
c. 空白行也將被忽略掉,并且 [tab] 按鍵所推開的空白同樣規(guī)為空格鍵;
d.?如果讀取到一個 Enter 符號 (CR) ,就嘗試開始執(zhí)行該行 (或該串) 命令;
e.?至于如果一行的內(nèi)容太多,則可以使用『 \[Enter] 』來延伸至下一行;
f.?『 # 』可做為批注!任何加在 # 后面的資料將全部被規(guī)為批注文字而被忽略!
?
轉(zhuǎn)載于:https://www.cnblogs.com/skorzeny/p/6624832.html
總結(jié)
以上是生活随笔為你收集整理的鸟哥的Linux私房菜-第10/11/12/13章(vim程序编辑器、学习bash、正则表达式与文件格式化处理、学习Shell Scripts)...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 取得文件名的后缀
- 下一篇: standard_init_linux.