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