Linux 正則表達式(*****)
1、什麼是正則表達式?
簡單的說,正則表達式就是爲處理大量的字符串而定義的一套規則和方法
通過定義的這些特殊符號的輔助,系統管理員就可以快速過濾,替換或輸出需要的字符串。
Linux 正則表達式一般以行爲單位處理的。
注意事項:
a、#alias grep='grep --color=auto' ===>以特定顏色高亮顯示匹配關鍵字
b、注意字符集,LC_ALL=C #export LC_ALL=C
實戰舉例:
1)^ word 搜索以 word 開頭的。vi ^ 一行的開頭
2)word$ 搜索以 word 結尾的。vi $ 一行的開頭
3)^$ 表示空行
4). 有且只能代表任意一個字符
5) \ 例 \. 就只代表點本身,轉義符號,讓有着特殊身份意義的字符,脫掉馬甲,還原原型。
6) * 例 o* 重複 0 個或多個前面的一個字符
7).* 匹配所有字符。延伸 ^.* 以任意多個字符開頭。 .*$ 以任意多個字符結尾
8)[abc] 匹配字符集合內的任意一個字符 [a-zA-Z],[0-9]
9)[^abc] 匹配不包含 ^ 後的任意字符的內容
10)a\{n,m\} 重複 n 到 m 次,前一個重複的字符。如果用 egrep/sed -r 可以去掉斜線
\{n,\} 重複至少 n 次,前一個重複的字符。如果用 egrep/sed -r 可以去掉斜線
\{n\} 重複 n 次,前一個重複的字符。如果用 egrep/sed -r 可以去掉斜線
\{,m\} 最多 m 次
注意:egrep,grep -E 或 sed -r 過濾一般特殊字符可以不轉義
實驗數據:
#cd /test/oldboy/
#touch oldboy.log
#vim oldboy.log
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
oldb y
good
goood
#grep "^m" oldboy ===>過濾出來以 m 開頭的行
#grep "m$" oldboy ===>以 m 結尾的行
#grep -v "^$" oldboy.log ===>去掉空行
#grep -vn "^$" oldboy.log ===>顯示行號
#grep "." oldboy.log ===> 匹配所有的,但沒有空行,匹配任意一個字符
#grep ".*" oldboy.log ===> 匹配所有的,包括空行
#grep "oldb.y" oldboy.log ===> 包含oldb,包含y,它兩之間的字符任意
#grep ".$" oldboy.log ===>以任意字符結尾
#grep "\.$" oldboy.log ===>以點結尾
#grep "0*" oldboy.log ===>匹配最少零個0,全匹配了
#grep -o "0*" oldboy.log ===> 精確匹配
#grep "[abc]" oldboy.log
#grep "[^a-z]" oldboy.log ===> a 到 z 的結果不匹配
#grep "[^0-9]" oldboy.log ===> 匹配非數字
#grep "0\{3\}" oldboy.log ===> 重複三個0
#egrep "0{3}" oldboy.log ====> 沒有轉義字符了,沒有顏色是因爲egrep沒有做別名
#grep -E "0{3}" oldboy.log
#grep -E "0{3,5}" oldboy.log
#grep -E "0{3,}" oldboy.log ===>至少三次
#grep -E "0{,3}" oldboy.log ===>最多三次
正則支持 grep、sed、awk
grep 一般常用參數
-a:在二進制文件中,以文本文件的方式搜索數據
-c:計算找到‘搜索字符串’的次數
-o:僅顯示出匹配 regexp 的內容(用於統計出現在文中的次數)
-i*****:忽略大小寫的不同,所以大小寫視爲相同
-n*****:在行首顯示行號
-v*****:反向選擇,即顯示沒有‘搜索字符串’內容的那一行
-E*****:擴展的 grep,即 egrep
--color=auto:以特定顏色高亮顯示匹配關鍵字
-A:after 的意思,顯示匹配字符串及其後 n 行的數據
-B:before 的意思,顯示匹配字符串及其前 n 行的數據
-C:顯示匹配字符串及其前後各 num 行
提示:-i,-v 爲常用參數
後向引用
#echo "oldboy oldgirl"|sed -r 's#(.*) (.*)#\1 \2#g'
取 IP 地址
#ifconfig eth0|sed -n '2p'|sed -r 's#.* addr:##g'|sed -r 's# Bc.*$##g' 或
#ifconfig eth0|sed -n '2p'|sed -r 's#.*dr:(.*) Bc.*#\1#g' 或
#ifconfig eth0|sed -rn '2s#.*dr:(.*) Bc.*$#\1#gp'
擴展的正則表達式:ERE(主要用於 egrep 或者 grep -E)
1) + 重複一個或一個以上前面的字符;(* 是 0 或多個)
2) ? 重複 0 個或一個 前面的字符
3) | 用或的方式查找多個符合的字符串
4) () 找出“用戶組”字符串
5) \b 匹配單詞的邊界
6) \w 匹配任意一個字符和數字
7) \W 匹配非字符與數字
例子:
\b 匹配單詞的邊界
# grep "oldboy" oldboy.log
# grep "\boldboy\b" oldboy.log
\w 匹配任意一個字符和數字 \W 匹配非字符與數字
# grep "\w" oldboy.log
# grep "\W" oldboy.log
+ 一個或多個
#grep -Eo "g+d" oldboy.log ===> 重複g;gd 、ggd ...
#grep -Eo "go+d" oldboy.log ===> 重複o;god 、good ...
#egrep -o "go+d" oldboy.log ===> 沒有顏色
#grep -o "go+d" oldboy.log ===> 沒有;因爲 + 不適合 grep
#grep -Eo "g?d" oldboy.log ===> 1個g或沒有;gd、d
#grep -Eo "go?d" oldboy.log ====> 1個o或沒有;god 、gd
| 表示同時過濾多個字符串
#egrep "god|good" oldboy.log
#grep -E "g?d|good" oldboy.log
#grep -E "g(la|oo)d" oldboy.log
#touch {a,b,c}.log
# ll *.log
# ll ?.log
# ll oldbo?.log
# ll ??????.log
# touch log.{1..3}
# touch log.{4,5,6}
# echo date
# echo `date`
# echo 'date'
# echo "date"
# a=oldboy # echo "$a" # echo '$a'
# ech && echo 1
# echo && echo 1
# ech || echo 1
# echo || echo1
# ech 2>/dev/null || echo 1
做題:
1、取 stat /etc/hosts 裏 644
2、取 ifconfig eth0 HWADDR
解答
1、取 stat /etc/hosts 裏 644
解法一:
# stat /etc/hosts
File: "/etc/hosts"
Size: 95 Blocks: 8 IO Block: 4096 普通文件
Device: fd00h/64768d Inode: 1441820 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2016-09-19 22:20:01.383437447 +0800
Modify: 2016-09-06 00:31:11.958161872 +0800
Change: 2016-09-06 00:31:11.995163159 +0800
# stat /etc/hosts|sed -n '4p'
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
# stat /etc/hosts|sed -n '4p'|awk -F "[0/]" '{print $2}'
644
解法二:
# stat /etc/hosts|awk -F '[0/]' 'NR==4 {print $2}'
解法三:
# stat /etc/hosts|sed -nr '4s#^.*\(0(.*)/-.*$#\1#gp'
解法四:
# stat -c %a /etc/hosts
解法五:
#ll a.log|cut -c 2-10|tr rwx- 4210 |awk -F "" '{print $1+$2+$3 $4+$5+$6 $7+$8+$9}'
2、取 ifconfig eth0 HWADDR
# ifconfig eth0|sed -nr '2s#^.*dr:(.*) Bca.*$#\1#gp'