正則表達式及文本處理
通俗點說,正則表達式就是處理字符串的方法,更加快速簡潔的代表各個要求參數,一般用于描述字符排列和匹配模式的一種語法規則,通過正則表達式一些特殊符號的輔助,讓用戶輕易的查找、刪除、替換一些字符串的處理程序。( ps:正則表達式和通配符不一樣,通配符代表的是bash接口的一個功能,但正則表達式是一種字符串處理的表達方式,兩者一定要分清楚。)
正則表示支持很多命令,例如:grep,sed.awk,vim,less,nginx,varnish等等命令,它分為兩類:
-
一種是基本正則表達式(BRE)
-
一種是擴展正則表達式(ERE)
下面介紹下基本正則表達式的元字符,分字符又分四類:
-
字符匹配
-
匹配次數
-
位置錨定
-
分組
字符匹配
- . 表示任意單個字符
- [ ] 表示匹配范圍內的任意單個字符([abc]r 相當于r一個個匹配里面的,如ar,br,cr)
例如:
- [^ ] 表示匹配范圍外的任意單個字符
- [:alpha:] 任意一個字母(相當于a-zA-Z)
- [:upper:] 任意一個大寫字母(相當于A-Z)
- [:lower:] 任意一個小寫字母(相當于a-z)
- [:digit:] 任意一個數字(相當于0-9)
- [:space:] 水平和垂直的空白字符(比blank包含的更多)
- [:blank:] 空白字符(空格和制表符)
- [:punct:] 標點符號
- [:alnum:] 任意字母和數字(相當于0-9a-zA-Z)
- [:print:] 可打印字符
例如:字符的使用
(ps:用的時候記得加[],例如:[[:alnum:]]或者[0-9a-zA-Z]這樣用,當然最好還是用[[:alnum:]]這種命令,它會比[a-z0-9A-Z]更為確定一些,在這里漢字也為字母)
匹配次數
- * 表示*號前面的一個字符的0-N次(它有一個貪婪模式,會盡量匹配最長)
例如:
- .* 表示任意多個長度的字符
- \? 表示\?符號前的字符0-1次
例如:
- \+ 匹配\+前的字符至少1次
例如:
- \{m,n} 表示\{m,n\}符號前的字符的m-n次
- \{m\} 表示{m\}符號前的字符m次
- \{n,\} 表示匹配前面字符至少n次
- \{,n} 表示匹配前面字符最多n次
例如:
(ps: \的意義是轉義字符,意思就是將一些有特殊符號的意義去除)
位置錨定
- ^ 之后接字符 表示^ 之后的字符出現在行首
例如:
- $ 之前接字符 表示$之前的字符出現在行尾
例如:
-
\> 表示\> 符號之后的字符出現在單詞的尾部
-
\< 表示\< 之前的字符出現在單詞的首部
-
\<字符 \> 表示只有小于號和大于號之間的字符
例如:
(ps:\b 同樣可以用于匹配單詞位置,只不過有時候怕不好區別,最好還是用大于小于,這樣也方便看清)。
分組
- 分組簡單來說就是\(\)用一個命令將一個或者多個字符捆綁在一起,當成一個整體進行處理,如:\(abc)+
例如:
-
分組括號中的模式匹配到的內容會被正則表達式引擎記錄于內部的變量中,這些變量的命名方式為: \1,\2,\3, …,\1表示從左側起第一個左括號以及與之匹配右括號之間的模式所匹配到的字符
\示例:grep \(r..t\).*\(a..b\) \1 \2
\1 :r..t
\2 :a..b
例如:第一個括號為\(r..t\) 那么\1也是r..t
- 或者:\|
示例:a\|b: a或b
C\|cat: C或cat
\(C\|c\)at:Cat或cat
例如:
{ps:有時候命令需要整體括起來,加雙引號“”}
擴展正則表達式
擴展正則表達式和基本正常表達式的功能是類似的,包括基本正則表達式的字符匹配都是相同的,擴展正則表達式照樣可以使用,不過擴展正則表達式和基本正則表達式還是有所不同,可以說在某些時候更加簡單。
剛剛我們用的匹配次數、位置錨定、分組的命令有非常多的\,如果使用多了也會看得眼花繚亂,自己有時候也會輸入錯誤或者忘記、漏掉\。
這里我只列出和基本正則有區別的命令:
字符匹配
(和基本正則一模一樣)
匹配次數
-
? 表示?符號前的字符0-1次(在基本正則里? 表示?符號前的字符0-1次)
- * 表示+前面的字符至少1次 (在基本正則里\+ 匹配\+前的字符至少1次)
例如:
-
{m,n} 表示{m,n}符號前的字符的m-n次
-
{m} 表示{m}符號前的字符m次
-
{n,} 表示匹配前面字符至少n次
-
{,n} 表示匹配前面字符最多n次
位置錨定
(和基本正則一模一樣)
分組
(和匹配次數一樣,把\全部去掉就行了)
grep (r..t).*(a..b) 1 2
\1 :r..t
\2 :a..b
(ps:\1還是要加\號的)
練習
在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 的常用選項
命令說明:按行處理,輸出文件中包含搜索字符串的所有行。(按關鍵字搜索)
格式:grep [-acinv] ‘搜索字符串’ filename
-
grep 選取命令,查找
-
grep -i 忽略字符的大小寫
-
grep –colour 高亮顯示搜索結果
-
grep -o z 表示只顯示匹配中的字符
-
grep -v 表示顯示匹配外的字符行
-
grep -E 表示擴展正則表達式
-
grep -A 數字 表示匹配的字符所對應的行數的后幾行將要被顯示出來
-
grep -B 數字 表示匹配的字符所對應的行數的錢幾行將要被顯示出來
-
grep -C 數字 表示匹配的字符所對應的前后幾行將要被顯示出來
-
grep -E =egrep (變量)
例子
- 在文件a.txt中搜索包含字符串good或glad的行:
grep -E 'g(oo|la)d' a.txt
- 找到以字母a結尾的單詞:
grep -E 'a[[:blank]]' a.txtgrep -E 'a\\b' a.txt
文件查看命令:
cat的常用選項
命令說明:按行處理,將一行消息的某段切出來。(查看文本文件)
格式:cut -d ‘分割字符’ -f fields
-
cut 查看文本文件
-
cut -A 顯示所有
-
cut -E 顯示每行的結束符
-
cut -n 加行號
-
cut -b 減去空白行(有字符的不減去,如空格,tab鍵)
-
cut -s 壓縮相鄰的空行
分頁查看
-
more 分頁顯示(b向回翻頁)
-
more -d 顯示翻頁及退出提示
-
less 分頁顯示(一頁頁查看文件或者輸出,可以回翻,可以搜索)
(ps:man使用的就是less分頁命令)
head的常用選項
-
head 查看命令(不加參數默認查看前10行)
-
head -n 3 查看命令前3行(不加n直接加數字也可以)
-
head -c 3 查看命令前3個字節(回車算一個字節,漢字3個字節)
tail的常用選項
-
tail 查看命令(不加參數默認查看后10行)
-
taul -c 3 查看命令從后開始3個字節
-
tail -f 追蹤查看文件最新追加的內容是否有變化(一般用于日志監控)
-
tail -n 3 查看命令從后開始3行
(ps:& 可放置后臺執行)
wc 的常用選項
命令說明:一般用于文本數據統計
格式:1. 行 2. 單詞 3. 字節 4. 文件名
-
wc -l 統計行數
-
wc -w 統計單詞
-
wc -c 統計字節
-
wc -m 統計字符
sort 的常用選項
-
sort -t: 指定:為分隔符(一般配合k使用,:可以更換各種分隔符, . / : % $ # 等)
-
sort -k: 指定:為分隔符的第幾列排序
-
sort -n 數字排序
-
sort -r 倒序
-
sort -f 忽略大小寫
-
sort -u 刪除重復行
uniq 的常用選項
-
uniq 合并相鄰的重復行
-
uniq -c 顯示重復的次數
-
uniq -d 只顯示重復過的行
-
uniq -u 只顯示不重復的行
(ps: 連續并且完全相同才為重復)
原創文章,作者:Az2h1丶,如若轉載,請注明出處:http://www.www58058.com/77908