Shell高級正則表達式
一. shell置換和引用shell
1.什麼是置換和引用數組
在shell中具備不少特殊意義的字符(*、?、\等),shell將包含元字符的字符串根據其意義轉換成新字符串的過程稱爲置換;關閉shell對特殊字符含義的解析處理被稱爲引用。微信
2.Shell置換的類型 編輯器
(1) 文件名置換ide
l 元字符函數
-* 匹配全部字符spa
-? 匹配全部單個字符命令行
-[] 匹配括弧內的字符3d
-[!] 匹配除括弧內的其餘字符
l 實例
-#ls abc*
-#ls ?abc
-#ls [abc]*
-#ls [!a]*
(2) 變量置換
l $varname和${varname} 置換變量的值,引用指定變量名的值
l ${varname:+value} 判斷varname變量是否設置,若是設置了,則顯示value,不然顯示空
l ${varname:?value} 若是變量varname變量未設置/爲空,則顯示錯誤信息value
l ${varname:-value} 若是變量varname變量未設置/爲空,則顯示value
l ${varname:=value} 若是變量varname變量未設置/爲穿,則顯示value,並將value值賦給varname變量
(3) 命令置換
l 使用`命令`,置換命令的結果。如cat `ls /etc/grub.conf`
l 使用$(命令)方式置換命令的結果。如cat $(ls /etc/grub.conf)
(4) 運算式置換
l 使用$((算術表達式))置換表達式的結果。如a=$( (1 + 1 ))
l 使用declare/let定義整型變量和給變量賦值。如let a=5+5
3.Shell引用
l 使用「\」取消其後面的特殊字符的含義,特殊字符有* ? [] ‘ ’ 「 」 \ $ ; & ( ) | ^ ! #;如「abc\*」.
l 使用‘’引用全部被括起來的字符,如echo ‘$a*’
l 使用「」引用全部除$和`之外的字符
二. 文本過濾
1.什麼是文本過濾
文本過濾指的是提取指定文件中的部份內容或替換指定文本文件中的字符串
2.文本過濾的命令
(1) head
功能:輸出文件頭部n行
格式:head -n 文件名
實例:#head -3 /etc/passwd
(2) tail
功能:輸出文件尾部n行或監控文件
格式:tail +n/-n/-f 文件
實例:#tail –3 /etc/passwd
#tail +3 /etc/passwd
#tail –f /etc/passwd
(3) uniq
功能: 檢查及刪除文本文件中重複出現的行列
格式: uniq [選項] [輸入文件][輸出文件]
選項:
-c 在每列旁邊顯示該行重複出現的次數。
-d 僅顯示重複出現的行列。
-f 忽略比較指定的欄位。
-s 忽略比較指定的字符。
-u 僅顯示出現一次的行。
-w<字符位置> 指定要比較的字符。
實例:
#uniq -u /root/aa
#uniq -dc /root/aa
(4) sort
功能:對文件進行排序/合併
格式:sort [選項] 文件名
選項:
-d:按字典順序(只對空格/字母/數字)
-f:忽略大小寫
-t:指定分隔符
-r反向
-n按數字大小顯示
-c只檢查是否有序,不實際排序
-u消除重複行
實例:
#sort -r /etc/passwd
#sort +1-2 /etc/passwd
(5) grep
功能:在文本文件中查找匹配的字符串
格式:#grep [參數] 「字符串」 文件
參數:
-? 同時顯示匹配行上下的?行
-b 在匹配行前面打印該行所在的塊號
-c 只打印匹配的行數,不顯示匹配的內容
-f File 從文件中提取模板,空文件中包含0個模板,因此什麼都不匹配
-h 當搜索多個文件時,不顯示匹配文件名前綴
-I 忽略大小寫差異
-q 取消顯示,只返回退出狀態。0則表示找到了匹配的行
-l 打印匹配模板的文件清單
-L 打印不匹配模板的文件清單
-n 在匹配的行前面打印行號
-s 不顯示關於不存在或者沒法讀取文件的錯誤信息
-v 反檢索,只顯示不匹配的行
-w 若是被\<和\>引用,就把表達式作爲一個單詞搜索
正則表達式元字符:
^
錨定行的開始 如:'^grep'匹配全部以grep開頭的行
$
錨定行的結束 如:'grep$'匹配全部以grep結尾的行
.
匹配一個非換行符的字符 如:'gr.p'匹配gr後接一個任意字符,而後是p
*
匹配零個或多個先前字符 如:'*grep'匹配全部一個或多個空格後緊跟grep的行。.*一塊兒用表明任意字符
[]
匹配一個指定範圍內的字符,如'[Gg]rep'匹配Grep和grep
[^]
匹配一個不在指定範圍內的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一個字母開頭,緊跟rep的行
\(..\)
標記匹配字符,如'\(love\)',love被標記爲1
\<
錨定單詞的開始,如:'\<grep'匹配包含以grep開頭的單詞的行
\>
錨定單詞的結束,如:'grep\>'匹配包含以grep結尾的單詞的行
x\{m\}
重複字符x,m次,如:'0\{5\}'匹配包含5個o的行
x\{m,\}
重複字符x,至少m次,如:'o\{5,\}'匹配至少有5個o的行
x\{m,n\}
重複字符x,至少m次,很少於n次,如:'o\{5,10\}'匹配5--10個o的行
實例:
# ls -l | grep '^a'
經過管道過濾ls-l輸出的內容,只顯示以a開頭的行。
# grep 'test' d*
顯示全部以d開頭的文件中包含test的行。
# grep 'test' aa bbcc
顯示在aa,bb,cc文件中匹配test的行。
# grep '[a-z]\{5\}'aa
顯示全部包含每一個字符串有5個連續小寫字符的字符串的行。
# grep 'w\(es\)t.*\1'aa
若是west被匹配,則es就被存儲到內存中,並標記爲1,而後搜索任意個字符(.*),這些字符後面緊跟着另一個es(\1),找到就顯示該行。若是用egrep或grep -E,就不用"\"號進行轉義,直接寫成'w(es)t.*\1'就能夠了。
(6) sed
功能:Sed(a stream editor)是流線型、非交互式編輯器。它容許你執行與vi編輯器裏同樣的編輯任務。Sed 程序不是與編輯器交互式工做的,而是讓你在命令行裏敲入編輯的命令,給文件命名,而後在屏幕上查看命令輸出結果。
格式:sed [選項] sed子命令 輸入文件 [輸出文件]
子命令:
p 打印匹配行
= 顯示文件行號
a \ 在定位行號後附加新文本信息
i \ 在定位行號前插入新文本信息
d 刪除定位行
c \ 用新文本替換定位文本
s 使用替換模式替換相應模式
r 從另外一個文件中讀文本
w 寫文本到一個文件
q 第一個模式匹配完成後推出或當即推出
{ } 在定位行執行的命令組
n 從另外一個文件中讀文本下一行,並附加在下一行
y 傳送字符
n 延續到下一輸入行;容許跨行的模式匹配語句
實例:
1> 打印:p命令
#sed '/north/p'datafile
默認輸出全部行,找到north的行重複打印
#sed –n '/north/p'datafile
禁止默認輸出,只打印找到north的行
#sed -n'/west/,/east/p' datafile
打印在west和east之間的模式範圍內全部行。
2> 刪除:d命令
#sed '3d' datafile
刪除第三行,其他行輸出到屏幕
#sed '3,$d' datafile
從第3行到最後一行都刪除,將剩餘部分輸出到屏幕
#sed '/north/d'datafile
將含有north的行刪除,其他輸出到屏幕
3> 替換:s命令
#sed 's/west/north/g'datafile
找到datafile中的全部west並替換成north,將替換後的內容輸出到屏幕。
#sed -n's/Hemenway/Jones/gp' datafile
全部的Hemenway所在的位置都用Jones來取代,並且只有改變的行被打印。
#sed -n's/\(Mar\)got/\1ianne/p' datafile
模式Mar被封裝在括弧裏且在一個專用寄存器裏存爲標記1。在替換串裏它將被引用作\1。而後用Marianne替代Margot。
4> 屢次編輯 -e 選項
#sed -e '1,3d' -e's/Hemenway/Jones/' datafile
5> 從文件中讀取:r命令
#sed '/Suan/rnewfile' datafile
r命令從newfile中讀取內容,將內容輸出到Suan的後面。
6> 寫入文件:w命令
#sed -n '/north/wnewfile' datafile
w命令把指定的行寫入到一個文件。
7> 添加:a命令
#sed '/north/a\ THENORTH SALES DISTRICT HAS MOVED<-----' datafile
奇怪的是a\後面必須另起一行,在輸入要添加的內容,不然會提示解析錯誤。
8> 插入:i命令
# sed '/north/i\ THENORTH SALES DISTRICT HAS MOVED' datafile
在符合模式的行前面插入內容。其他和a\命令相同。
9>下一個:n命令
#sed'/eastern/{n;s/AM/Archie/;}' datafile
10>變換:y 命令
#sed'1,3y/abcdefghijklmnopqrst/ABCDEFGHIJKLMNOPQRST/' datafile
將對應字母進行轉換。
11>退出:q 命令
#sed '5q' datafile
在打印了5行以後,用q命令退出sed程序。
三. Awk
1. 什麼是awk
Awk是一種程序語言,對文本文件的處理具備很強的功能,如修改、比較、提取、打印等。awk語言的最基本功能是在文件或字符串中基於指定規則瀏覽和抽取信息。awk抽取信息後,才能進行其餘文本操做。完整的awk腳本一般用來格式化文本文件中的信息。
2. 如何執行awk程序
Awk程序能夠直接在命令行中執行,也能夠存放在文件而後在命令行調用。
方法一:直接在命令行中執行
#gawk ‘program’ input-file1 input-file2…
方法二:調用awk程序文件
#gawk –f program-file input-file1 input-file2…
任何a w k語句都由模式和動做組成。在一個a w k腳本中可能有許多語句。模式部分決定動做語句什麼時候觸發及觸發事件。處理即對數據進行的操做。若是省略模式部分,動做將時刻保持執行狀態。模式能夠是任何條件語句或複合語句或正則表達式。
模式包括兩個特殊字段B E G I N和E N D。使用B E G I N語句設置計數和打印頭。B E G I N語句使用在任何文本瀏覽動做以前,以後文本瀏覽動做依據輸入文件開始執行。E N D語句用來在a w k完成文本瀏覽動做後打印輸出文本總數和結尾狀態標誌。若是不特別指明模式, a w k老是匹配或打印行數。
實際動做在大括號{ }內指明。動做大多數用來打印,可是還有些更長的代碼諸如i f和循環語句及循環退出結構。若是不指明採起動做, a w k將打印出全部瀏覽出來的記錄。
3. 認識文件中的記錄和域
域1 分隔符 域2 分隔符 域3 分隔符 域4
abc # 0 2 / 9 9 # 4 8 # fine
l 默認文件中以換行符結束的行稱爲記錄,awk中能夠指定記錄分隔符,也能夠用$0引用整個記錄
l 記錄是由若干個域構成的,域之間由指定的分隔符隔開,默認分隔符爲空格。能夠用$1…$n引用記錄中的各個域
4. 正則表達式和運行算符
(1) 算術運算符:+ -*、/ %(取餘) ^(乘方)
(2) 關係運算符:< > <= >= == != ~(匹配) !~(不匹配)
(3) 邏輯運算符:&& || !
(4) 賦值運算符:= += -= *= /= %= ^=
(5) 自增、自減運算符:++ --
(6) 數組引用:in
5. awk變量和數組
(1)awk變量分爲數值型和字符型,用戶引用變量時即定義了變量,變量類型由變量內容決定,引用變量時不用加$。
(2)awk內置變量以下
l ARGC 命令行參數的數目。
l ARGIND 命令行中當前文件的位置(從0開始算)。
l ARGV 包含命令行參數的數組。
l CONVFMT 數字轉換格式(默認值爲%.6g)
l ENVIRON 環境變量關聯數組。
l ERRNO 最後一個系統錯誤的描述。
l FIELDWIDTHS 字段寬度列表(用空格鍵分隔)。
l FNR 同NR,但相對於當前文件。
l FS字段分隔符(默認是任何空格)。
l IGNORECASE若是爲真,則進行忽略大小寫的匹配。
l NF當前記錄中的字段數。
l NR當前記錄數。
l OFMT數字的輸出格式(默認值是%.6g)。
l OFS輸出字段分隔符(默認值是一個空格)。
l ORS輸出記錄分隔符(默認值是一個換行符)。
l RLENGTH由match函數所匹配的字符串的長度。
l RS記錄分隔符(默認是一個換行符)。
l RSTART由match函數所匹配的字符串的第一個位置。
l SUBSEP 數組下標分隔符(默認值是\034)。
(3)awk數組
awk容許使用數組,數組的格式以下。
Varname[下標]
awk數據組的下標能夠數字(從1開始)和字符表示,name[1]、name[a]。
6.awk輸出命令
輸出命令是awk最經常使用的操做命令,它包含print和printf兩種方式。
(1) print
#awk ‘{print $0}’ /etc/passwd
(2)printf(格式化輸出)
格式:printf 「輸出格式」,表達式
實例:#awk ‘{printf 「user name:%s」,%1’} /etc/passwd
注:print和printf語句中經常使用的轉義字符和格式符
-轉義字符
l \t table製表位
l \n 換行符
l \\ 表示「\」
l \b 表示退格
-格式符
l %c 輸出單個字符
l %d %i 輸出整數
l %e 按科學計數法輸出小數
l %f 輸出浮點數
l %s 輸出字符串
l %% 輸出%
7.Awk控制語句
(1) if語句
功能:實現條件分支
格式:if (expr) {action1}
else {action2}
實例:#awk -F: ‘{if ($3==0) {print $0}}’ /etc/passwd
(2)for語句
功能:實現循環執行
格式:for (init_cntr;test_cntr;incr_cntr){action}
實例:#awk ‘{for(i=1;i<5;i++) {printf 「%s」,$i;printf 「:」} print 「\n」}’
(3)while語句
功能:實現循環執行
格式:while (expr){action}
實例:#awk ‘{i=1;while(i<5) {printf 「%s」,$i;printf 「:」} print 「\n」 }’
注:還有一種do…while形式
(4)break和continue
退出循環和進行下一次循環
(5)exit
退出awk
(6)next
跳事後面內容,讀取下一行
8.awk函數
length(string) 求串string中的字符個數
index(search,string) 返回string中search串的位置
match(string,reg) 返回常規表達式reg匹配的string中的位置
sub(reg,string,target) 第一次當常規表達式reg匹配,替換target串中的字符串
substr(string,position,len)返回一個以position開始len個字符的子串
totower(string) 返回string中對應的小寫字符
toupper(string) 返回string中對應的大寫字符
split(string,store,delim) 根據分界符delim,分解string爲store的數組元素
sprintf(format,variable) 返回一個包含基於format的格式化數據,variables是要放到串中的數據
strftime(format,timestamp) 返回一個基於format的日期或者時間串,timestmp是systime()函數返回的時間
srand(x) 初始化隨機數發生器。若是忽略x,則使用system()
system() 返回自1970年1月1日以來通過的時間(按秒計算)
rand() 0-1之間的隨機數
9.Awk腳本實例
#vi /awk/st1.awk
#!/bin/awk -f
#to call:du|duawk.awk
#prints file/direc's in bytes and blocks
BEGIN{
OFS="\t";
print "name" "\t\t","bytes","blocks\n"
print "==============================="}
{print $2,"\t\t",$1*512,$1}
#chmod a+x/awk/st1.awk
#du|awk/st1.awk
微信掃一掃 、關注公衆號
不定時分享資料視頻