shell腳本的編寫及正則表達(dá)式:
成都創(chuàng)新互聯(lián)長(zhǎng)期為上1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為酒泉企業(yè)提供專業(yè)的成都做網(wǎng)站、成都網(wǎng)站建設(shè),酒泉網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
一、shell腳本的基本:
1.首先shell腳本到底是什么?
1)純文本文檔--文件中所存儲(chǔ)的數(shù)據(jù)都是以字符為單位進(jìn)行存儲(chǔ)的;
2)根據(jù)用戶的需求來(lái)解決用戶問(wèn)題的大量命令的組合體
3)“執(zhí)行冪等性”——任何命令多次執(zhí)行的結(jié)果是一致的
注意:很多命令都不具備“執(zhí)行冪等性”,在shell腳本中就需要大量的程序邏輯來(lái)判斷某個(gè)命令是否滿足其運(yùn)行條件,以避免在運(yùn)行過(guò)程中出現(xiàn)嚴(yán)重錯(cuò)誤。
2.腳本的基本代碼內(nèi)容:
1)首先我們可以利用文本編輯工具來(lái)編寫shell腳本:
例如:Nano 、vi、Vim、emacs、pico
在這里我們推薦使用Vim,因?yàn)樗哂姓Z(yǔ)法著色,自動(dòng)縮進(jìn)等特性
腳本的命令方式:可以使用.sh的文件名為后綴;在低版本的Vim編輯器,只能根據(jù).sh的后綴命令來(lái)識(shí)別是否為shell腳本,高版本的Vim編輯器,則無(wú)需過(guò)多的文件后綴名的問(wèn)題;
2)shebang:首行必須是shebang,解釋器路徑,必須占據(jù)就對(duì)行首:在執(zhí)行時(shí),啟動(dòng)相應(yīng)的解釋器以解釋腳本內(nèi)諸多的命令
因?yàn)槲覀兪褂玫膕hell為bash
#! /bin/bash
3) 在shell腳本中,除了shebang之外,所有以#開(kāi)頭的行都為注釋行,解釋器都會(huì)忽略這樣的行的內(nèi)容
例如:
# author:秦耀東
# type:基礎(chǔ)練習(xí)
...
4)空白行:解釋器會(huì)忽略腳本中所有的空白行;
5)大量的關(guān)鍵字和命令:if、else、then、do、while、for、...
6) bash中所有的特殊想字符
/// 注意:shell腳本一旦運(yùn)行,是在當(dāng)前的shell中根據(jù)shebang的指示,開(kāi)啟一個(gè)解釋器(子shell)解釋執(zhí)行代碼內(nèi)容,shell腳本的內(nèi)容是在一個(gè)子shell進(jìn)程中實(shí)現(xiàn)的;
3.腳本的運(yùn)行方法:
1)為腳本文件賦予執(zhí)行權(quán)限,直接運(yùn)行此文件:
~ ]# chmod +x /PATH/TO/SCRIPT_FILE
注意:如果在執(zhí)行腳本時(shí),只寫腳本的名不寫路徑的話,必須確保PATH變量中保存的路徑下,能夠找到該文件;
2)直接使用解釋器運(yùn)行腳本,講腳本作為解釋器命令的參數(shù);
bash /PATH/TO/SCRIPT_FILE
bash -x /PATH/TO/SCRIPT_FILE(將腳本的運(yùn)行過(guò)程展示出來(lái),一般用于腳本排錯(cuò))
bash -n /PATH/TO/SCRIPT_FILE(對(duì)腳本進(jìn)行語(yǔ)法排錯(cuò),如果存在語(yǔ)法錯(cuò)誤,則 bash會(huì)給予提示,針對(duì)于這類錯(cuò)誤提示,,需要我們自行判斷錯(cuò)誤的發(fā)生位置)
二、正則表達(dá)式:
在學(xué)習(xí)正則表達(dá)式之前我們先來(lái)學(xué)習(xí)文本處理工具:
文本處理三劍客:
grep系:grep、egrep、fgrep,文本搜索工具,基于"PATTERN"對(duì)于給定的文本進(jìn)行模糊搜索,grep系默認(rèn)工作于貪婪模式下;
sed:Stream EDitor,流編輯器,行編輯器,文本編輯工具;
awk:gawk——GNU awk,文本格式化工具,文本報(bào)告生成器,文本處理的編程語(yǔ)言;
1.grep系:grep egrep fgrep
1:grep:默認(rèn)僅支持基本正則表達(dá)式
全稱為Global search Regular Expression and Print out the line.利用正則表達(dá)式進(jìn)行全局搜索并將匹配的行顯示出來(lái);
1)grep [OPTIONS] PATTERN [FILE...]
////這里我們要介紹一下PATTERN,PATTERN是一種過(guò)濾條件,是由正則表達(dá)式元字符以及沒(méi)有特殊含義的文本字符組成;
正則表達(dá)式的元字符會(huì)被正則表達(dá)式引擎解釋為特殊含義;
正則表達(dá)式的文本字符是指只具備字符表面含義的字符;
常用選項(xiàng)為:
-i, --ignore-case:忽略文本字符的大小寫;
-v, --invert-match:反向匹配;最終顯示的結(jié)果是PATTERN不能成功匹配的行;
-c, --count:計(jì)數(shù),統(tǒng)計(jì)匹配PATTERN的所有的行數(shù);
-o, --only-matching:關(guān)閉貪婪模式,僅顯示PATTERN能夠匹配的內(nèi)容;
-q, --quiet, --silent:安靜模式,不輸出任何匹配結(jié)果;
--color[=WHEN], --colour[=WHEN]:將匹配PATTERN的內(nèi)容以特殊顏色高亮顯示;
--color=auto
-E, --extended-regexp:擴(kuò)展的正則表達(dá)式,grep -E相當(dāng)于egrep;
-F, --fixed-strings, --fixed-regexp:grep -F相當(dāng)于fgrep
-G, --basic-regexp:基本的正則表達(dá)式,egrep -G相當(dāng)于grep
-P, --perl-regexp:使用PCRE(Perl Common Regular Expression)引擎;
-A NUM, --after-context=NUM:在顯示匹配PATTERN的行的同時(shí)顯示其后面的NUM行;
-B NUM, --before-context=NUM:在顯示匹配PATTERN的行的同時(shí)顯示其前面的NUM行;
-C NUM, -NUM, --context=NUM:在顯示匹配PATTERN的行的同時(shí)顯示其前后各NUM行;
基本的正則表達(dá)式的元字符:
1) 字符匹配;
. :匹配任意單個(gè)字符;
[]:匹配指定范圍內(nèi)的任意單個(gè)字符;
[^]:匹配指定范圍以外的任意單個(gè)字符;
下列所有的字符集都可以放置于[]之中用于匹配單個(gè)字符;
[:lower:]:所有小寫的單個(gè)字符
[:upper:]:所有大寫的字母
[:alpha:]:所有字母字符
[:digit:]:所有的十進(jìn)制數(shù)字
[:space:]:所有的空白字符
[:alnum:]:表示所有的大小寫字母以及十進(jìn)制數(shù)字
[:punct:]:所有的標(biāo)點(diǎn)符號(hào)
[:xdigit:]:所有的十六進(jìn)制數(shù)字;
a-z:所有的小寫字母
A-Z:所有的大寫字母
0-9:標(biāo)識(shí)所有的十進(jìn)制數(shù)字
2)次數(shù)匹配
*:其前面的字符可以出現(xiàn)任意次(0次,1次或多次);
\?:其前面的字符可有可無(wú)(0次或1次);
\+:其前面的字符至少出現(xiàn)一次(1次或多次);
\{m\}:其前面的字符必須出現(xiàn)m次;
\{m,n\}:其前面的字符至少出現(xiàn)m次,至多出現(xiàn)n次;(m \{,n\}:其前面的字符至少出現(xiàn)0次,至多出現(xiàn)n次; \{m,\}:其前面的字符至少出現(xiàn)m次,×××; 在正則表達(dá)式中,表示任意長(zhǎng)度任意字符的方式:.* 位置錨定字符: 行錨定: 行首錨定:^ 行尾錨定:$ 字錨定: 字首錨定:\<或\b 字尾錨定:\>或\b \b:舊版本中的錨定方法,建議不使用; 對(duì)于正則表達(dá)式引擎來(lái)說(shuō),字是由非特殊字符組成的連續(xù)字符串; 分組與引用字符: \(PATTERN\):將此PATTERN所匹配到的所有字符當(dāng)作一個(gè)不可分割的整體來(lái)處理 在正則表達(dá)式引擎之中,有一系列的內(nèi)置變量,這些變量會(huì)保存所有分組內(nèi)的字符信息,用于后向引用;這些變量依次是:\1, \2, \3, ... pattern1\(pattern2\)pattern3\(pattern4\(pattern5\)\) \1:pattern2 \2:pattern4 \3:pattern5 \1:第一組小括號(hào)中的pattern匹配到的字符; \2:第二組小括號(hào)中的pattern匹配到的字符; ... ///// 例:請(qǐng)找出在/etc/passwd中用戶的UID和GID相同的用戶賬戶; ~]# grep '\(\<[[:digit:]]\+\>\).*\1' /etc/passwd 或:\| 注意:\|將其左右兩邊的字符串當(dāng)作整體對(duì)待; A\|american :A或american 請(qǐng)找出ifconfig命令的執(zhí)行結(jié)果中數(shù)值在100-255之間的整數(shù); 第一位:1 2 第二位:0-90-4 5 第三位:0-90-9 0-5 ifconfig | grep '\<\(1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\>' 請(qǐng)找出ifconfig命令的執(zhí)行結(jié)果中數(shù)值在0-255之間的整數(shù); 2.grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...] 默認(rèn)情況下,grep命令后面只允許有一個(gè)PATTERN; 如果想要在一次grep所搜過(guò)程中寫多個(gè)PATTERN,則需要使用-e選項(xiàng);每個(gè)-e選項(xiàng)只能使用一個(gè)PATTERN作為參數(shù); 將所需要的PATTERN寫入到一個(gè)文件中,保證每行只有一個(gè)PATTERN;我們就可以使用-f FILE方式來(lái)實(shí)現(xiàn)多PATTERN匹配; egrep: egrep [OPTIONS] PATTERN [FILE...] 擴(kuò)展的正則表達(dá)式元字符: 1) 字符匹配; . :匹配任意單個(gè)字符; []:匹配指定范圍內(nèi)的任意單個(gè)字符; [^]:匹配指定范圍以外的任意單個(gè)字符; 下列所有的字符集都可以放置于[]之中用于匹配單個(gè)字符; [:lower:]:所有小寫的單個(gè)字符 [:upper:]:所有大寫的字母 [:alpha:]:所有字母字符 [:digit:]:所有的十進(jìn)制數(shù)字 [:space:]:所有的空白字符 [:alnum:]:表示所有的大小寫字母以及十進(jìn)制數(shù)字 [:punct:]:所有的標(biāo)點(diǎn)符號(hào) [:xdigit:]:所有的十六進(jìn)制數(shù)字; a-z:所有的小寫字母 A-Z:所有的大寫字母 0-9:標(biāo)識(shí)所有的十進(jìn)制數(shù)字 2)次數(shù)匹配 *:其前面的字符可以出現(xiàn)任意次(0次,1次或多次); \?:其前面的字符可有可無(wú)(0次或1次); \+:其前面的字符至少出現(xiàn)一次(1次或多次); \{m\}:其前面的字符必須出現(xiàn)m次; \{m,n\}:其前面的字符至少出現(xiàn)m次,至多出現(xiàn)n次;(m \{,n\}:其前面的字符至少出現(xiàn)0次,至多出現(xiàn)n次; \{m,\}:其前面的字符至少出現(xiàn)m次,×××; 在正則表達(dá)式中,表示任意長(zhǎng)度任意字符的方式:.* 位置錨定字符: 行錨定: 行首錨定:^ 行尾錨定:$ 字錨定: 字首錨定:\<或\b 字尾錨定:\>或\b 分組與引用字符: \(PATTERN\):將此PATTERN所匹配到的所有字符當(dāng)作一個(gè)不可分割的整體來(lái)處理 在正則表達(dá)式引擎之中,有一系列的內(nèi)置變量,這些變量會(huì)保存所有分組內(nèi)的字符信息, 用于后向引用;這些變量依次是:\1, \2, \3, ... pattern1\(pattern2\)pattern3\(pattern4\(pattern5\)\) \1:pattern2 \2:pattern4 \3:pattern5 \1:第一組小括號(hào)中的pattern匹配到的字符; \2:第二組小括號(hào)中的pattern匹配到的字符; ... ///// 例:請(qǐng)找出在/etc/passwd中用戶的UID和GID相同的用戶賬戶; ~]# grep '\(\<[[:digit:]]\+\>\).*\1' /etc/passwd 或:\| 注意:\|將其左右兩邊的字符串當(dāng)作整體對(duì)待; A\|american :A或american fgrep:PATTERN中所有的字符都被當(dāng)作文本字符來(lái)處理; 其他的文本處理命令: wc: wc [OPTION]... [FILE]... -l:只顯示行數(shù) -w:只顯示字?jǐn)?shù) -c:只顯示字符數(shù) cut:remove sections from each line of files 能夠被cut命令修剪的文件,一般都是具有一定結(jié)構(gòu)或格式的文本文檔;/etc/passwd cut OPTION... [FILE]... -d, --delimiter=DELIM:指定在實(shí)施修剪操作時(shí)所依賴的分隔符,默認(rèn)是空白字符; -f, --fields=LIST:根據(jù)定義的分隔符來(lái)指定字段的編號(hào); 地址定界使用方法: #:選擇被指定的單個(gè)字段; #,#:離散的多個(gè)被指定的單個(gè)字段; #-#:連續(xù)的多個(gè)被指定的字段; --output-delimiter=STRING:指定輸出分隔符; awk: awk -F "DELIMITER" '[/PATTERN/]{print $1,$2,...$NF}' FILE... -F "DELIMITER":指定字段分隔符,默認(rèn)為空白字符; $1,$2,...,$NF:根據(jù)字段分隔符切割出來(lái)的文本片段都存放在相應(yīng)的內(nèi)部變量中; sort:sort lines of text files,將文本文件按行繼續(xù)排序,默認(rèn)排序規(guī)則是按照ASCII表中的字符順序進(jìn)行,這個(gè)排序標(biāo)準(zhǔn)可修改; -r, --reverse:逆序排序 -R, --random-sort:隨機(jī)排序,這種隨機(jī)算法是非常簡(jiǎn)陋的,不適用于復(fù)雜環(huán)境; -u, --unique:重復(fù)出現(xiàn)的行,只保留一行;(連續(xù)且完全相同的行叫重復(fù)),祛重; -n, --numeric-sort:以數(shù)字的數(shù)值大小進(jìn)行排序; -t, --field-separator=SEP:指定字段分隔符; -k, --key=KEYDEF:指明根據(jù)哪個(gè)關(guān)鍵字段進(jìn)行排序,一般和-t同時(shí)使用; uniq:report or omit repeated lines -d, --repeated:只顯示重復(fù)出現(xiàn)的行,而且每一組重復(fù)行只顯示一行; -u, --unique:只顯示不重復(fù)的行; -c, --count:在每行以前綴的方式顯示重復(fù)行的重復(fù)次數(shù); diff:compare files line by line 同一文件的不同修改版本;打補(bǔ)??; patch:apply changes to files
本文題目:shell腳本及正則表達(dá)式
標(biāo)題路徑:http://weahome.cn/article/ipiopo.html