12.1什么是正則表達式
正則表達式就是處理字符串的方法,它是以行為單位來進行字符串的處理行為,正則表達式通過一些特殊符號的輔助,可以讓用戶輕易達到查找、刪除、替換某特定字符串的處理程序。
vi、grep、awk、sed支持正則表達式,而cp,ls等命令只能使用bash自身的通配符
12.2基礎正則表達式
grep高級參數:
grep [-A] [-B] [--color=auto] 'string' filename
-A:after的意思,除了列出該行外,后續的n行也列出來
-B:before的意思,除了列出該行外,前面的n行也列出來
--color=auto 可將正確的那個選取數據列出顏色
基礎正則表達式練習:
例一:查找特定字符串
grep -n ‘the’ regular_exPRess.txt
grep -vn 'the' regular_express.txt (-v反向選擇)
例二:利用中括號[]來查找集合字符
grep -n 't[ae]st' regular_express.txt (可匹配test或tast)
grep -n '[^g]oo' regular_express.txt (oo前不能有g的字符)
grep -n '[^[:lower:]]oo' regular_express.txt ([:lower:]代表a-z的意思)
例三:行首和行尾字符
grep -n '^test' regular_express.txt
(注:^在[]內表示“反向選擇”,在[]外表示定位在行首)
grep -n '/.$' regular_express.txt (找出行尾結束為小數點的那一行)
例四:任意一個字符.與重復字符*
grep -n ‘g..d’ regular_express.txt (可匹配good,glad等字符)
grep -n 'ooo*' regular_express.txt (匹配至少兩個o以上的字符)
grep -n 'g.*g' regular_express.txt (找出g開頭與g結尾的字符串,.*表示o個或多個任意字符的意思)
例五:限定連續RE字符范圍{}
grep -n 'o/{2/}' regular_express.txt (找出兩個o的字符串)
grep -n ‘go/{2,5/}g’ regular_express.txt (g后有兩個到5個o,然后接一個g的字符串)
grep -n ‘go/{2,/}g’ regular_express.txt (g后有兩個及以上的o,然后接一個g的字符串)
基礎正則表達式字符:
^Word :待查找的字符串(word)在行首
word$ :待查找的字符串(word)在行尾
. :代表一定有一個任意字符的字符
/ : 轉義字符,將特殊符號的特殊意義去除
* : 重復0個或多個的前一個字符
[list] :從字符集合的RE字符里面找出想要選取的字符
[n1-n2]:從字符集合的RE字符里面找出想要選取的字符范圍
[^list] :從字符集合的RE字符里面找出不要的字符串或范圍
/{n,m/}:連續n到m個的前一個RE字符,/{n/}表示連續n個,/{n,/}表示連續n個及以上
sed工具:(詳見sed & awk)
格式:sed [-nefr] [動作]
參數:
-n :使用安靜模式,在一般的sed用法中,所有來自STDIN的數據一般都會被列到屏幕上,但如果加上-n參數后,則只有經過sed特殊處理的那一行才會被列出來
-e :直接在命令行模式上進行sed的動作編輯
-f :直接將sed的動作寫在一個文件內,-f filename 則可以執行filename內的sed動作
-r :sed的動作支持的擴展型正則表達式的語法
-i :直接修改讀取的文件內容,而不是由屏幕輸出
動作說明:[n1,[n2]] function
n1,n2不見得會存在,一般代表選擇進行動作的行數
function參數:
a :新增,a的后面可以接字符串,而這些字符串會在目前的下一行出現
i :插入,i 的后面可以接字符串,而這些字符串會在目前的上一行出現
c :替換,c的后面可以接字符串,這些字符串可以替換n1,n2之間的行
s :替換,可以直接進行替換工作,通常這個s可以搭配正則表達式
d :刪除,因為是刪除,所以d后面通常不接任何參數
p :打印,也就是將某個選擇的數據打印出來,通常p會與參數sed -n一起運行
12.3擴展的正則表達式
+ :重復一個或多個的前一個RE字符
? :0個或一個的前一個RE字符
| :用或的方式找出字符串
() :找出“組”的字符串 (如:egrep -n ‘g(la|oo)d’ regular_express.txt 表示找出glad或good字符串)
()+:多個重復組的判別 (如echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)+C' 找出開頭是A結尾是C,中間有一個以上的“xyz”字符串)
12.4文件的格式化與相關處理
格式化打印 printf:
格式:printf '打印格式' 實際內容
格式方面的幾個特殊樣式:
/a 警告聲音輸出
/b 退格鍵
/f 清除屏幕
/n 輸出新的一行
/r 亦即Enter按鍵
/t 水平的tab按鍵
/v 垂直的tab按鍵
/xNN NN為兩個數字,可以轉換數字成字符
關于C語言內,常見的變量格式
%ns :n代表數字,s代表string,即多個字符
%ni : n代表數字,i代表interger,即多少整數字數
%N.nf :n和N都是數字,f代表float,如十個位數,小數點兩位為 %10.2f
awk工具 (詳見sed & awk):
格式:awk ‘條件類型1{動作1} 條件類型2{動作2} ...’ filename
awk主要是處理每一行的字段內的數據,而默認的字段的分割符為空格鍵或tab鍵
變量:
NF : 每一行($0)擁有的字段總數
NR :目前awk所處理的是“第幾行”數據
FS :目前的分隔字符,默認是空格鍵
邏輯運算符:
> < >= <= == !=
例:
cat /etc/passwd | awk '{FS=":"} $3<10 {print $1 "/t" $3}'
cat pay.txt | awk '{if(NR==1) printf "%10s %10s,%10s/n",$1,$4,"Total"} NR>=2 {total=$1+$4 printf "%10s %10d %10.2f/n",$1,$3,total}'
文本比較工具diff:
diff用于比較兩個文件之間的區別,并且是以行為單位的,diff也可以比較兩個目錄
格式:diff [-bBi] from-file to-file
-b :忽略一行當中僅有多個空白的區別(如“about me”和“about me”視為相同)
-B:忽略空白行的區別
-i:忽略大小寫的區別
patch -pN <patch_file 更新
patch -R -pN <patch_file 還原
范例:以/tmp/test內的passwd.old 與passwd.new 制作補丁文件,并更新舊版數據
diff -Naur passwd.old passwd.new >passwd.patch
更新舊文件,變成和新文件一樣
patch -p0 <passwd.patch
(pathing file passwd.old)
恢復舊文件的內容
patch -R -p0 <passwd.patch
文件打印pr:
pr /etc/man.config (打印文本文件man.config)
新聞熱點
疑難解答