shell腳本的編寫(xiě)及正則表達(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)編寫(xiě)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í),只寫(xiě)腳本的名不寫(xiě)路徑的話,必須確保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:忽略文本字符的大小寫(xiě);
-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:]:所有小寫(xiě)的單個(gè)字符
[:upper:]:所有大寫(xiě)的字母
[:alpha:]:所有字母字符
[:digit:]:所有的十進(jìn)制數(shù)字
[:space:]:所有的空白字符
[:alnum:]:表示所有的大小寫(xiě)字母以及十進(jìn)制數(shù)字
[:punct:]:所有的標(biāo)點(diǎn)符號(hào)
[:xdigit:]:所有的十六進(jìn)制數(shù)字;
a-z:所有的小寫(xiě)字母
A-Z:所有的大寫(xiě)字母
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)
\{,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ò)程中寫(xiě)多個(gè)PATTERN,則需要使用-e選項(xiàng);每個(gè)-e選項(xiàng)只能使用一個(gè)PATTERN作為參數(shù);
將所需要的PATTERN寫(xiě)入到一個(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:]:所有小寫(xiě)的單個(gè)字符
[:upper:]:所有大寫(xiě)的字母
[:alpha:]:所有字母字符
[:digit:]:所有的十進(jìn)制數(shù)字
[:space:]:所有的空白字符
[:alnum:]:表示所有的大小寫(xiě)字母以及十進(jìn)制數(shù)字
[:punct:]:所有的標(biāo)點(diǎn)符號(hào)
[:xdigit:]:所有的十六進(jìn)制數(shù)字;
a-z:所有的小寫(xiě)字母
A-Z:所有的大寫(xiě)字母
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)
\{,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á)式
新聞來(lái)源:http://jinyejixie.com/article30/ipiopo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、品牌網(wǎng)站制作、微信公眾號(hào)、域名注冊(cè)、App開(kāi)發(fā)、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)