12.26&12.27 -正則表達式
正則表達式
第1章 使grep/egrep 過濾出的東西加上顏色
cat >>/etc/profile<<EOF
alias grep='grep --color=auto'
alias egrep='egrep --color=auto'
EOF
source /etc/profile
alias grep egrep
第2章 正則表達式分類
2.1 基礎正則表達式:basic regular expression BRE
^ $ . * [] [^] \
2.2 擴展正則表達式:extended regular expression ERE
| + () {} ?
2.3 正則與通配符區別:
作用 支持的命令
通配符: 查找文件名 Linux大部分命令都支持 以.txt結尾的文件
正則: 在文件中過濾內容 sed,grep,awk Python Java
2.4 使用正則表達式註意事項
1.正則表達式按照行為單位處理
2.正則神坑-中文符號
‘’ “” () 。 * …… ¥ | {} 【】
'' "" () . * ^
3.區分大小寫
環境
cat oldboy.txt
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 size is http://blog.oldboyedu.com
my qq is 49000448
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
第3章 基礎正則(BRE)
3.0.1 ^ 以……開頭的行
grep ‘
3.0.2 $ 以……結尾的行
grep ‘m$’ /oldboy.txt
神坑:::::有的行結尾有時候會多個空格
cat -A 顯示出文件中的特殊標記 行尾 $標記
3.0.3 ^$ 空行 什麽都沒有(包括空格也沒有)
grep -v '^$' oldboy.txt 排除文件中的空行
grep -n 顯示行號
3.0.4 . 任意一個字符 不會匹配空行
grep ‘.’ oldboy.txt
grep -o 顯示命令執行過程,顯示grep命令每一次找到了什麽
空格也執行一次命令
3.0.5 * 前一個字符連續出現了0次或0次以上
grep ‘0*’ oldboy.txt
坑:過濾的目標出現了0次的時候,會顯示整個文件的內容
3.0.6 .* 所有 任何符號 包含空行
貪婪性 ( . * .* + ? )
1. .*所有符號 任何符號 連續出現的字符 有多少匹配多少
2. 正則表達 所有符號 或 連續出現 會表現出貪婪性
3. 匹配到最後一個符合的條件---------(貪婪性)
找出以m開頭並以m結尾的行 ---- 並且
[root@oldboy oldboy]# grep '^m.*m$' oldboy.txt
my blog is http://oldboy.blog.51cto.com
3.0.7 \ 撬棍 轉義字符 脫掉馬甲打回原形
找出文件中以.結尾的行
[root@oldboy log]# grep '\.$' /oldboy/oldboy.txt
I teach linux.
not 4900000448.
tr命令 1.不能直接修改文件內容
2.一對一替換
特點 3.無法直接讀取文件內容 接 <
\n =====回車
例:把文件中的空格替換為回車
[root@oldboy oldboy]# tr '\n' ' ' oldboy.txt 回車替換為空格
tr: extra operand `oldboy.txt' tr不能直接讀取文件
Try `tr --help' for more information. 必須加<輸入重定向符號
[root@oldboy oldboy]# tr '\n' ' ' <oldboy.txt
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 size is http://blog.oldboyedu.com my qq is 49000448 not 4900000448. my god ,i am not oldbey,but OLDBOY!
報錯:tr命令無法直接讀取文件 必須加< 不能修改文件內容
替換:把123替換為abc sed 閹割版
[root@oldboy oldboy]# echo 123123|tr '123' 'abc'
abcabc
一對一替換
[root@oldboy oldboy]# echo 12332|tr '123' 'abc'
abccb
3.0.8 [ ] [abc] 找出包含a或b或c的行 []字符內沒有特殊含義
單個字符分割,以”或”連接
找出以小寫字母開頭並以.或!結尾的行
[root@oldboy oldboy]# grep '^[a-z].*[.!]$' oldboy.txt
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
3.0.9 [^] 排除,相當於是一個符號(每次匹配一個字符) 排除a或b或c
找出文件中不是以m或n開頭的行
[root@oldboy oldboy]# grep '^[^mn]' oldboy.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
our size is http://blog.oldboyedu.com
grep/egrep ‘[a-Z]’
第4章 擴展正則(ERE)
4.0.1 + 前一個字符連續出現一次或多次
grep -E ===egrep
[root@oldboy log]# egrep '0+' /oldboy/oldboy.txt
my qq is 49000448
not 4900000448.
+小結:
1.前一個字符連續出現1次或一次以上
2.+一般與[]進行配合
例題:
lidao.×××
cat id.txt
湯 610702199107053598
鄒 371481199403259478
莫 52020319810613433X
韓 460106199111137270
榮 530124197504135438
榮 oldboy
榮 babygirl
榮 530124197504135438
阮 360702197902169951
翁 331002198504132813
任 621223198708245176
姜 370602198507189574
霍 320904198403048179
如何判斷用戶的×××號碼是否正確?
特殊符號幫助我們處理文件====正則表達式
在文件中過濾出你想要的或不想要的內容
解答: egrep '[0-9X]+' id.txt
[root@oldboy log]# egrep '[0-9X]+' /oldboy/id.txt
湯 610702199107053598
鄒 371481199403259478
4.0.2 | 或者
找出3306或1521端口服務
[root@oldboy log]# egrep '3306|1521' /etc/services
mysql 3306/tcp # MySQL
mysql 3306/udp # MySQL
ncube-lm 1521/tcp # nCube License Manager
ncube-lm 1521/udp # nCube License Manager
4.0.3 () 表示一個整體 反/後向引用
找出文件中包含oldboy或oldbey的行
[root@oldboy log]# egrep 'oldb(o|e)y' /oldboy/oldboy.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
our size is http://blog.oldboyedu.com
my god ,i am not oldbey,but OLDBOY!
4.0.4 ( ) 反向引用/後向引用----sed 先保護在使用
sed -r 識別擴展正則
使輸出結果為 12<34>56 這個就叫後向引用
[root@oldboy oldboy]# echo 123456 |sed -r 's#(12)(34)(56)#\1<\2>\3#g'
12<34>56 \2對應前面第幾個
12.27
4.0.5 {} 0{n,m} 前一個字符至少連續出現了n次,最多連續出現了m次
0{n,m} 前一個字符至少連續出現n次,最多連續出現了m次
0{n} 前一個字符連續出現n次
0{n,} 前一個字符至少連續出現n次
0{,m} 前一個字符最多連續出現了m次
例:查找文本中0最少出現3次最多出現4次的行
[root@oldboy oldboy]# egrep '0{3,4}' oldboy.txt
my qq is 49000448
not 4900000448.
例:查找文本中0出現3次的行
[root@oldboy oldboy]# egrep '0{3}' oldboy.txt
my qq is 49000448
not 4900000448.
找出0連續出現了三次的行(正好三次)
[root@oldboy oldboy]# egrep '^.*[^0]0{3}[^0].*$' oldboy.txt
my qq is 49000448
錯誤:加號在花括號前面,花括號失效
4.0.6 ?前一個字符出現零次或一次
[root@oldboy oldboy]# cat good.txt
good
gd
god
goood
[root@oldboy oldboy]# egrep 'go?d' good.txt
gd
god
4.1 ERE小結
1. +一般與[]進行配合 把各種連續的東西取出來
2. | 或
3. () 一個整體 後向引用---sed
4. {} 0{n,m} 前一個字符至少連續出現了n次,最多連續出現了m次
5. ? 前一個字符出現了零次或一次
4.2 基礎正則與擴展正則的區別
基礎正則: grep/sed/awk
擴展正則: egrep/sed -r/awk
4.3 grep/sed 可以加\轉義符號識別擴展正則
[root@oldboy oldboy]# grep 'go\+d' good.txt
good
god \只能轉義對單個字符 雞肋
goood
補充:了解
4.4 正則總結
1. grep/egrep -o和顏色是grep獨有
2. 一步步分解
4.5 正則學習資料
man grep
info sed/awk/grep
https://www.gnu.org/software/grep/manual/grep.html
12.26&12.27 -正則表達式