正則表達(dá)式及文本處理
通俗點(diǎn)說(shuō)慕嚷,正則表達(dá)式就是處理字符串的方法圆米,更加快速簡(jiǎn)潔的代表各個(gè)要求參數(shù)吊输,一般用于描述字符排列和匹配模式的一種語(yǔ)法規(guī)則,通過(guò)正則表達(dá)式一些特殊符號(hào)的輔助激率,讓用戶輕易的查找唇聘、刪除、替換一些字符串的處理程序柱搜。( ps:正則表達(dá)式和通配符不一樣,通配符代表的是bash接口的一個(gè)功能剥险,但正則表達(dá)式是一種字符串處理的表達(dá)方式聪蘸,兩者一定要分清楚。)
正則表示支持很多命令表制,例如:grep,sed.awk,vim,less,nginx,varnish等等命令,它分為兩類:
1. 一種是基本正則表達(dá)式(BRE)
2. 一種是擴(kuò)展正則表達(dá)式(ERE)
下面介紹下基本正則表達(dá)式的元字符健爬,分字符又分四類:
1. 字符匹配
2. 匹配次數(shù)
3. 位置錨定
4. 分組
字符匹配
.? 表示任意單個(gè)字符
例如:
[ ]?? 表示匹配范圍內(nèi)的任意單個(gè)字符([abc]r 相當(dāng)于r一個(gè)個(gè)匹配里面的,如ar,br,cr)
例如:
[^ ]? 表示匹配范圍外的任意單個(gè)字符
[:alpha:]?? 任意一個(gè)字母(相當(dāng)于a-zA-Z)
[:upper:]? 任意一個(gè)大寫字母(相當(dāng)于A-Z)
[:lower:]? 任意一個(gè)小寫字母(相當(dāng)于a-z)
[:digit:]???任意一個(gè)數(shù)字(相當(dāng)于0-9)
[:space:]? 水平和垂直的空白字符(比blank包含的更多)
[:blank:]?? 空白字符(空格和制表符)
[:punct:]? 標(biāo)點(diǎn)符號(hào)
[:alnum:]?? 任意字母和數(shù)字(相當(dāng)于0-9a-zA-Z)
[:print:]?? 可打印字符
例如:字符的使用
(ps:用的時(shí)候記得加[]么介,例如:[[:alnum:]]或者[0-9a-zA-Z]這樣用娜遵,當(dāng)然最好還是用[[:alnum:]]這種命令,它會(huì)比[a-z0-9A-Z]更為確定一些壤短,在這里漢字也為字母)
匹配次數(shù)
*?? 表示*號(hào)前面的一個(gè)字符的0-N次(它有一個(gè)貪婪模式设拟,會(huì)盡量匹配最長(zhǎng))
例如:
.*?? 表示任意多個(gè)長(zhǎng)度的字符
\???? 表示\?符號(hào)前的字符0-1次
例如:
\+???? 匹配\+前的字符至少1次
例如:
\{m,n}??? 表示\{m,n\}符號(hào)前的字符的m-n次
\{m\}??? ?表示{m\}符號(hào)前的字符m次
\{n,\}??? ?表示匹配前面字符至少n次
\{,n}???? ?表示匹配前面字符最多n次
例如:
(ps: \的意義是轉(zhuǎn)義字符,意思就是將一些有特殊符號(hào)的意義去除)
位置錨定
^ 之后接字符??? 表示^ 之后的字符出現(xiàn)在行首
例如:
$ 之前接字符??? 表示$之前的字符出現(xiàn)在行尾
例如:
\>????? 表示\> 符號(hào)之后的字符出現(xiàn)在單詞的尾部
\<????? 表示\< 之前的字符出現(xiàn)在單詞的首部
\<字符 \>????? 表示只有小于號(hào)和大于號(hào)之間的字符
例如:
(ps:\b 同樣可以用于匹配單詞位置久脯,只不過(guò)有時(shí)候怕不好區(qū)別纳胧,最好還是用大于小于,這樣也方便看清)帘撰。
分組
分組簡(jiǎn)單來(lái)說(shuō)就是\(\)用一個(gè)命令將一個(gè)或者多個(gè)字符捆綁在一起跑慕,當(dāng)成一個(gè)整體進(jìn)行處理,如:\(abc)+
例如:
分組括號(hào)中的模式匹配到的內(nèi)容會(huì)被正則表達(dá)式引擎記錄于內(nèi)部的變量中,這些變量的命名方式為: \1,\2,\3, ...,\1表示從左側(cè)起第一個(gè)左括號(hào)以及與之匹配右括號(hào)之間的模式所匹配到的字符
\示例:grep \(r..t\).*\(a..b\) \1 \2
\1 :r..t
\2 :a..b
例如:第一個(gè)括號(hào)為\(r..t\) 那么\1也是r..t
或者:\|
示例:a\|b: a或b
C\|cat: C或cat
\(C\|c\)at:Cat或cat
例如:
{ps:有時(shí)候命令需要整體括起來(lái),加雙引號(hào)“”}
擴(kuò)展正則表達(dá)式
擴(kuò)展正則表達(dá)式和基本正常表達(dá)式的功能是類似的核行,包括基本正則表達(dá)式的字符匹配都是相同的牢硅,擴(kuò)展正則表達(dá)式照樣可以使用,不過(guò)擴(kuò)展正則表達(dá)式和基本正則表達(dá)式還是有所不同芝雪,可以說(shuō)在某些時(shí)候更加簡(jiǎn)單减余。
剛剛我們用的匹配次數(shù)、位置錨定绵脯、分組的命令有非常多的\佳励,如果使用多了也會(huì)看得眼花繚亂,自己有時(shí)候也會(huì)輸入錯(cuò)誤或者忘記蛆挫、漏掉\赃承。
這里我只列出和基本正則有區(qū)別的命令:
字符匹配
(和基本正則一模一樣)
匹配次數(shù)
?????? 表示悴侵?符號(hào)前的字符0-1次(在基本正則里? 表示?符號(hào)前的字符0-1次)
*??????? 表示+前面的字符至少1次 (在基本正則里\+ 匹配\+前的字符至少1次)
例如:
{m,n}?? 表示{m,n}符號(hào)前的字符的m-n次
{m}????? 表示{m}符號(hào)前的字符m次
{n,}????? 表示匹配前面字符至少n次
{,n}????? 表示匹配前面字符最多n次
位置錨定
(和基本正則一模一樣)
分組
(和匹配次數(shù)一樣瞧剖,把\全部去掉就行了)
grep (r..t).*(a..b) 1 2
\1 :r..t
\2 :a..b
(ps:\1還是要加\號(hào)的)
練習(xí)
在ifconfig 中找出其ip地址的命令。
ifconfig|grep -E “(<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])>.){3}<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]>)”
例如:
grep 的常用選項(xiàng)
命令說(shuō)明:按行處理可免,輸出文件中包含搜索字符串的所有行抓于。(按關(guān)鍵字搜索)
格式:grep [-acinv] ‘搜索字符串’ filename
grep??????? 選取命令,查找
grep -i???? 忽略字符的大小寫
grep --colour??? ?高亮顯示搜索結(jié)果
grep -o z????????? 表示只顯示匹配中的字符
grep -v???????????? 表示顯示匹配外的字符行
grep -E???????????? 表示擴(kuò)展正則表達(dá)式
grep -A 數(shù)字??? ?表示匹配的字符所對(duì)應(yīng)的行數(shù)的后幾行將要被顯示出來(lái)
grep -B 數(shù)字????? 表示匹配的字符所對(duì)應(yīng)的行數(shù)的錢幾行將要被顯示出來(lái)
grep -C 數(shù)字????? 表示匹配的字符所對(duì)應(yīng)的前后幾行將要被顯示出來(lái)
grep -E =egrep?? (變量)
例子
在文件a.txt中搜索包含字符串good或glad的行:
grep -E 'g(oo|la)d' a.txt
找到以字母a結(jié)尾的單詞:
grep -E 'a[[:blank]]' a.txt
grep -E 'a\\b' a.txt
文件查看命令:
cat的常用選項(xiàng)
命令說(shuō)明:按行處理浇借,將一行消息的某段切出來(lái)捉撮。(查看文本文件)
格式:cut -d '分割字符' -f fields
cut???????? ?查看文本文件
cut -A????? 顯示所有
cut -E????? 顯示每行的結(jié)束符
cut -n???? ?加行號(hào)
cut -b????? 減去空白行(有字符的不減去,如空格妇垢,tab鍵)
cut -s??????壓縮相鄰的空行
分頁(yè)查看
more??????? ?分頁(yè)顯示(b向回翻頁(yè))
more -d???? 顯示翻頁(yè)及退出提示
less?????????? 分頁(yè)顯示(一頁(yè)頁(yè)查看文件或者輸出巾遭,可以回翻,可以搜索)
(ps:man使用的就是less分頁(yè)命令)
head的常用選項(xiàng)
head?????????? ?查看命令(不加參數(shù)默認(rèn)查看前10行)
head -n 3???? 查看命令前3行(不加n直接加數(shù)字也可以)
head -c 3?????查看命令前3個(gè)字節(jié)(回車算一個(gè)字節(jié)闯估,漢字3個(gè)字節(jié))
tail的常用選項(xiàng)
tail???????? ? ?查看命令(不加參數(shù)默認(rèn)查看后10行)
taul -c 3? ? 查看命令從后開始3個(gè)字節(jié)
tail -f????? ? 追蹤查看文件最新追加的內(nèi)容是否有變化(一般用于日志監(jiān)控)
tail -n 3??? ?查看命令從后開始3行
(ps:& 可放置后臺(tái)執(zhí)行)
wc 的常用選項(xiàng)
命令說(shuō)明:一般用于文本數(shù)據(jù)統(tǒng)計(jì)
格式:1. 行 2. 單詞 3. 字節(jié) 4. 文件名
wc -l??????? 統(tǒng)計(jì)行數(shù)
wc -w??????統(tǒng)計(jì)單詞
wc -c?????? 統(tǒng)計(jì)字節(jié)
wc -m????? 統(tǒng)計(jì)字符
sort 的常用選項(xiàng)
sort -t:?????? 指定:為分隔符(一般配合k使用灼舍,:可以更換各種分隔符, . / : % $ # 等)
sort -k:????? 指定:為分隔符的第幾列排序
sort -n?????? 數(shù)字排序
sort -r???? ???倒序
sort -f?????? ?忽略大小寫
sort -u????? ?刪除重復(fù)行
uniq 的常用選項(xiàng)
uniq????????? 合并相鄰的重復(fù)行
uniq -c????? 顯示重復(fù)的次數(shù)
uniq -d????? 只顯示重復(fù)過(guò)的行
uniq -u????? 只顯示不重復(fù)的行
(ps: 連續(xù)并且完全相同才為重復(fù))