正則表達式(Regular Expression)是通過一些特殊字符的排列鸥拧,用以查找茉稠、替換额湘、刪除一行或多行文字字符串卿吐。簡單地說,正則表達式就是用在字符串的處理上面的一項“表示式”锋华。
正則并不是一個工具程序嗡官,它是一種字符串處理的標準依據(jù),如果你想以正則表達式的方式處理字符串毯焕,就得要使用支持正則表達式的工具程序才行衍腥,如vi、sed纳猫、awk婆咸、grep
正則表達式對于系統(tǒng)管理員來說實在是很重要,可用此將重要信息選取出來芜辕,并產(chǎn)生便于查閱的報表來簡化管理流程尚骄。到達更精簡處理日常事物。
正則表達式基本上是一種“表示法”侵续,只要工具程序支持這種表示法倔丈,那么該工具程序就可以用來作為正則表達式的字符串處理之用。例如vi状蜗、grep需五、sed、awk等工具诗舰,因為它們有支持正則警儒,所以這些工具就可以使用正則的特殊字符來進行字符串的處理。但如cp、ls等命令 并未支持正則蜀铲,多依舊只能使用bash自身的通配符而已边琉。
正則表達式的字符串表示方式依照不同的嚴謹度而分為 ?基礎正則表達式 ?和 ?擴展正則表達式。
基礎正則表達式
文件其實記錄的僅有0和1(二進制文件)记劝,我們看到的字符文字都是通過編碼表轉(zhuǎn)換來的变姨。由于不同語系的編碼數(shù)據(jù)并不相同,所以就會造成數(shù)據(jù)選取結(jié)果的區(qū)別厌丑。使用正則表達式時定欧,需要特別留意當時環(huán)境的語系為何,否則可能會發(fā)現(xiàn)與別人不相同的選取結(jié)果怒竿。
以下特殊符號需要我們了解下:
grep的一些高級用法:
dmesg ?| ?grep ?-n ?-A3 ?-B2 ?'eth' ? ?#列出關(guān)鍵字所在前兩行和后三行
grep是一個很常見也很常用的命令砍鸠,他最重要的功能就是進行字符串數(shù)據(jù)的對比,然后將符合用戶需求的字符串打印出來耕驰。
需要說明的是爷辱,grep在數(shù)據(jù)中查找一個字符串時,是以整行為單位來進行數(shù)據(jù)的選取的朦肘!
基礎正則表達式字符(characters):
擴展的正則表達式:
以上這些就是擴展的正規(guī)表示法的特殊字節(jié)饭弓。另外,要特別強調(diào)的是媒抠,那個 ! 在正規(guī)表示法當中并不是特殊字節(jié)弟断, 所以,如果你想要查出來文件中含有 ! 與 > 的字行時趴生,可以這樣:
grep -n '[!>]' regular_express.txt
sed工具:
sed本身也是一個管道命令阀趴,可以分析standard input,而且sed還可以將數(shù)據(jù)進行替換冲秽、刪除舍咖、新增、選取特定行等的功能锉桑。
以行為單位的新增/刪除功能排霉;
以行為單位的替換和顯示功能;
部分數(shù)據(jù)的查找并替換的功能民轴;
直接修改文件內(nèi)容攻柠;
awk:好用的數(shù)據(jù)處理工具
awk是一個非常棒的數(shù)據(jù)處理工具。相比于sed常常作用于一整行的處理后裸,awk比較傾向于將一行分成數(shù)字各”字段“來處理瑰钮。因此,awk相當適合處理小型的數(shù)據(jù)微驶。
awk主要是處理每一行的字段內(nèi)數(shù)據(jù)浪谴,而默認的字段分隔符為空格鍵或tab鍵开睡。
awk '條件1 {動作1} 條件2 {動作2} ......' filename
awk是以行為一次處理的單位,而以字段為最小的處理單位苟耻。
每一行的每個字段都是有變量名稱的篇恒,那就是$1,$2...等變量名稱。
$0代表這一行凶杖,$1$2$3代表這行的字段胁艰。
awk內(nèi)建變量:
列出每一行的賬號(就是$1);
列出目前處理的行數(shù)(就是awk內(nèi)的NR變量)智蝠;
并且說明腾么,該行有多少字段(就是awk內(nèi)的NF變量);
awk的邏輯運算符:
所有awk動作杈湾,即在 { } 內(nèi)的動作解虱,如果有需要多個命令輔助時,可利用“毛秘;”間隔饭寺,或者直接以【Enter】按鍵來隔開每個命令阻课,例如上面的范例中叫挟,用了三個【Enter】;
邏輯運算當中限煞,如果是“等于”的情況抹恳,則務必使用兩個等號“==”;
格式化輸出時署驻,在printf的格式設置當中奋献,務必加上\n,才能進行分行旺上;
與bash瓶蚂,shell的變量不同,在awk當中宣吱,變量可以直接使用窃这,不需要加上$符號。
格式化打诱骱颉:printf
打印格式化這個printf命令杭攻,乍看之下好像也沒什么很重要的。不過疤坝,如果你需要自行編寫一些軟件兆解,需要將一些數(shù)據(jù)在屏幕上漂漂亮亮的輸出的話,那么printf可也是一個很不錯的工具跑揉。
文件比較工具:diff锅睛、cmp、patch
diff:通常用于比較同一軟件的不同版本之間,比較配置文件與源文件的區(qū)別现拒,并且是以行為單位來比較的乖订。
用diff比較文件真的是很簡單。不過具练,你不要用diff去比較兩個完全不想干的文件乍构,因為比不出個結(jié)果來!另外扛点,diff也可以比較不同目錄下相同文件名的內(nèi)容哥遮。
cmp:主要也是比較兩個文件,但它主要利用“字節(jié)”單位去比較陵究,當然也可以比較二進制文件眠饮。
diff主要是以“行”為單位去比較,cmp則是以“字節(jié)”為單位去比較铜邮,這并不相同仪召。
patch:patch與diff有密不可分的關(guān)系!比較新舊文件的區(qū)別松蒜,并將區(qū)別文件制作成為系統(tǒng)補丁文件扔茅,再由補丁文件更新舊文件即可。
一般由diff制作出的比較文件通常使用.patch擴展名秸苗。
重點回顧:
正則表達式就是處理字符串的方法召娜,它是以行為單位來進行字符串的處理行為;
正則表達式通過一些特殊符號的輔助惊楼,可以讓用戶輕易到達查找玖瘸、刪除、替換某特定字符串的處理程序檀咙;
只要工具程序支持正則表達式雅倒,那么該工具程序就可以用來作為正則表達式的字符串處理之用;
正則表達式與通配符是完全不一樣的弧可。通配符(wildcard)代表的是bash操作接口的一個功能蔑匣,但正則表達式則是一種字符串處理的表示方式;
使用grep或其他工具進行正則表達式的字符串比較時侣诺,因為編碼的問題會有不同的狀態(tài)殖演,因此,你最好將LANG等變量設置為C或者是en等英文語系年鸳;
grep與egrep在正則表達式里面是很常見的兩個程序趴久,其中,egrep支持更嚴謹?shù)恼齽t表達式的語法搔确;
由于編碼系統(tǒng)的不同彼棍,不同的語系(LANG)會造成正則表達式選取數(shù)據(jù)的區(qū)別灭忠,因此可利用特殊符號如[:upper:]來替代編碼編碼范圍較佳;
由于嚴謹度的不同座硕,正則表達式之上還有更嚴謹?shù)臄U展正則表達式弛作;
基礎正則表達式的特殊字符由 * ?? ?[ ] ?[ - ] ?[ ^ ] ?^ ?$等华匾;
常見的正則表達式工具有 grep 映琳、sed、vim蜘拉、awk萨西;
printf可以通過一些特殊符號來將數(shù)據(jù)進行格式化輸出;
awk可以使用字段為依據(jù)旭旭,進行數(shù)據(jù)的重新整理與輸出谎脯;
文件的比較中,可利用diff及cmp進行比較持寄,其中diff主要用在純文本文件方面的新舊版本比較源梭;
patch命令可以將舊版數(shù)據(jù)更新到新版(主要由diff創(chuàng)建patch的補丁來源文件)。