第1章 正規表示式
1.1 正規表示式的介紹
正則是用來過濾檔案內容
為處理大量文字|字串而定義的一套規則和方法。
以行為單位出來,一次處理一行。
1.2 為什麼使用正規表示式
1)linux運維工作 大量過濾(找東西)日誌工作。化繁為簡。
2)簡單,高效,易用。
3)正規表示式高階工具:三劍客 都支援。
1.3 正規表示式與萬用字元的比較
1)正規表示式應用非常廣泛,存在於各種語言中,php perl python grep sed awk 支援。ls* 萬用字元。
2)但現在學的是Linux中的正規表示式,最常應用正規表示式的命令是grep(egrep)、sed、awk-->正規表示式通常只有awk、sed、grep能使用
3)正規表示式和萬用字元有本質區別.
4)萬用字元例子 ls file *.log filef.log grep "e*" e ee eeee ef
正規表示式用來找:【檔案】內容,文字,字串。高階貨,三劍客。
萬用字元用來找什麼:檔名(*.txt),或找檔案,普通命令都支援。
5)不需要思考的判斷方法:在三劍客awk、sed、grep egrep 都是正則,其他都是萬用字元。
6)區分萬用字元和正規表示式最簡單的方法:
檔案[目錄]名-->萬用字元----->ls *.txt
檔案內容(字串,文字,【檔案】內容)-->正規表示式 grep "oldboy" oldboy.txt
7)萬用字元和正規表示式都有“ *”、“ ?”、“ []”,但是萬用字元的這些符號都能自身代表任意字元,而正規表示式的這些符號只能代表這些符號前面的字元。
1.4 正則的分類:
基礎正規表示式 (BRE basic regular expression)
擴充套件正規表示式 (ERE extended regular expression)
注意:
中英文
[root@oldboyedu-lnb ~]# # ‘’ “” () 。 * …… ¥ | {} 【. [root@oldboyedu-lnb ~]# '' "" () . * ^ $ | {} []
grep的別名 --color 在centos7.X 系統預設存在的
在centos6.X 系統是不存在的
在centos6.x過濾內容的時候 不會顯示顏色 如何處理:
vim /etc/profile alias grep='grep --color' 使用grep命令來測試正規表示式: grep ' ' file
第2章 grep的用法
2.1 什麼是grep、egrep和fgrep
-
Linux系統中grep命令是一種強大的文字搜尋工具,它能使用正規表示式搜尋文字,並把匹配的行列印出來(匹配到的標紅)。grep全稱是Global Regular Expression Print,表示全域性正規表示式版本,它的使用許可權是所有使用者。
-
grep的工作方式是這樣的,它在一個或多個檔案中搜尋字串模板。如果模板包括空格,則必須被引用,模板後的所有字串被看作檔名。搜尋的結果被送到標準輸出,不影響原檔案內容。
-
grep可用於shell指令碼,因為grep通過返回一個狀態值來說明搜尋的狀態,如果模板搜尋成功,則返回0,如果搜尋不成功,則返回1,如果搜尋的檔案不存在,則返回2。我們利用這些返回值就可進行一些自動化的文字處理工作。
-
egrep = grep -E:擴充套件的正規表示式 (除了< , > , \b 使用其他正則都可以去掉\)
-
fgrep=grep -F:不支援正規表示式,可以過濾普通的字串
作用:文字搜尋工具,根據使用者指定的“模式”對目標文字逐行進行匹配檢查;列印匹配到的行 模式:
選項:
--color=auto: 對匹配到的文字著色顯示` -v: 顯示不被pattern匹配到的行` -i: 忽略字元大小寫 -n:顯示匹配的行號
-c: 統計匹配的行數` -o: 僅顯示匹配到的字串 -q: 靜默模式,不輸出任何資訊 -A #: after, 後#行 -B #: before, 前#行 -C #:context, 前後各#行 -e:實現多個選項間的邏輯or關係 grep –e cat -e dog file -w:匹配整個單詞``-E:使用ERE -F:相當於fgrep,不支援正規表示式 -f file: 根據模式檔案處理
grep實戰演練:
例一
將磁碟利用率進行倒序排序:
例二
過濾root後的一行
[root@centos7 ~]# cat /etc/passwd | grep -nA1 root 1:root:x:0:0:root:/root:/bin/bash 2-bin:x:1:1:bin:/bin:/sbin/nologin -- 10:operator:x:11:0:operator:/root:/sbin/nologin 11-games:x:12:100:games:/usr/games:/sbin/nologin You have new mail in /var/spool/mail/root
過濾root的前一行
例三
過濾root的前後一行
例四
正則^
^ # 以什麼開頭 把以什麼開頭的行查詢出來
查詢oldboy.txt文字中以m開頭的行 列印出來
例五:正則$
$ #以什麼什麼結尾 把以什麼結尾的行的內容輸出
查詢oldboy.txt中以m$結尾的行
PS: cat-A在檔案的結尾處加一個結尾標誌符$符號
[root@oldboyedu-lnb ~]# cat -A oldboy.txt I am lizhenya teacher!$ I teach linux.$
例6
過濾oldboy.txt中所有的空格
例7:過濾空行
例8
使用grep的單引號和雙引號
單引號 看到什麼就會過濾什麼內容
例9
顯示行號
例10
匹配任意單個字元 不匹配空行 匹配空格
[root@oldboyedu-lnb ~]# grep '.' oldboy.txt I am lizhenya teacher! I teach linux.
grep -o 顯示grep的匹配過程
[root@oldboyedu-lnb ~]# grep '...' oldboy.txt -o I a m l izh
例11
查詢以. 結尾的行
[root@oldboyedu-lnb ~]# tr "\n" "\t" < oldboy.txt
例12
* 前一個字元出現了0次或者0次以上
grep ‘8*’ oldboy.txt -o
例13
.*組合使用 表示所有任何符號 顯示包含空行 類似於萬用字元的*
特點: 貪婪匹配 有多少匹配多少
例14
以m.*結尾的行 貪婪匹配
例15
正規表示式第一坑:* 如果沒有過濾到內容 會顯示所有的內容
正規表示式第二坑: .* 貪婪匹配 儘可能的去匹配 相當於萬用字元的*
正規表示式第三坑: 神奇的[] 在中括號裡的符號 大部分沒有特殊的含義 寫什麼找什麼 相當於轉譯符\
正規表示式第四坑 第一個尖號代表取反,第二個尖號代表自身符號,$代表本身含義
例16
第五個正則: []
[abc] 相當於是一個符號 每次匹配1個字元 找出包含a或b或c
查詢oldboy.txt 中的[abc] 內容
查詢[a] [b] [c]
匹配檔案中包含a或b或c的行
使用序列的方式查詢檔案內容
例17
匹配a-z A-Z的行
例18
grep的引數-i 不區分大小寫進行過濾檔案內容
例19
匹配0-9的行 0 1 2 3 4 ... 9
例20
過濾檔案中的大小字母 和包含數字0-9的行
grep ‘[a-z A-Z 0-9] ’ oldboy..txt 等於grep ‘[a-Z0-9]’ oldboy.txt
PS:萬用字元中的[]中也可以寫多個條件 瞭解
例21
[]中的特殊符號 都相當於脫掉了馬甲 本來的含義
例22
查詢\或者.結尾的行
例23
查詢以任意單個字元加一個! 結尾的行
擴充套件正則
語法格式: grep 支援普通的正規表示式
egrep支援擴充套件的正規表示式 或者 grep -E
egrep =grep -E
^ [^ ] [^abc] 取反 排除a 排除b 排除c 中括號預設不匹配空行
. 匹配任意單個字元 [] 匹配指定範圍內的任意單個字元,示例:[wang] [0-9] [a-z] [a-zA-Z] [^] 匹配指定範圍外的任意單個字元 [:alnum:] 字母和數字 [:alpha:] 代表任何英文大小寫字元,亦即 A-Z, a-z [:lower:] 小寫字母 [:upper:] 大寫字母 [:blank:] 空白字元(空格和製表符) [:space:] 水平和垂直的空白字元(比[:blank:]包含的範圍廣) [:cntrl:] 不可列印的控制字元(退格、刪除、警鈴...) [:digit:] 十進位制數字 [:xdigit:]十六進位制數字 [:graph:] 可列印的非空白字元 [:print:] 可列印字元 [:punct:] 標點符號
匹配次數:用在要指定次數的字元後面,用於指定前面的字元要出現的次數
* 匹配前面的字元任意次,包括0次 貪婪模式:儘可能長的匹配 .* 任意長度的任意字元 \? 匹配其前面的字元0或1次 \+ 匹配其前面的字元至少1次 \{n\} 匹配前面的字元n次 \{m,n\} 匹配前面的字元至少m次,至多n次 \{,n\} 匹配前面的字元至多n次 \{n,\} 匹配前面的字元至少n次
位置錨定:定位出現的位置
^ 行首錨定,用於模式的最左側 $ 行尾錨定,用於模式的最右側 ^PATTERN$ 用於模式匹配整行 ^$ 空行 ^[[:space:]]*$ 空白行 \< 或 \b 詞首錨定,用於單詞模式的左側 \> 或 \b 詞尾錨定,用於單詞模式的右側
擴充套件正規表示式:
(
1)字元匹配: - . 任意單個字元 - [ ] 指定範圍的字元 - [^] 不在指定範圍的字元 - 次數匹配: - \* :匹配前面字元任意次 - ? : 0 或1次 - \+ :1 次或多次 - {m} :匹配m次 次 - {m,n} :至少m ,至多n次 (2)位置錨定: - ^ : 行首 - $ : 行尾 - \<, \b : 語首 - \>, \b : 語尾 - 分組:() - 後向引用:\1, \2, ... - 或者: a|b a或b C|cat C或cat (C|c)at Cat或cat (3)總結 除了\<, \b : 語首、\>, \b : 語尾;使用其他正則都可以去掉\。
顯示基名
顯示目錄名:兩次的grep為了處理兩次/
1. 顯示除a或b或c的所有字元
2.過濾檔案中不包含^或$的行 第一個^是取反 第二個是普通符號
第一個擴充套件正則: + 前一個字元連續出現1次或1次以上
取出包含18 8連續出現1次或1次以上的行
取出連續出現的字母
第二個擴充套件正則: |或者
取出包含 lizhenya和blog的行
排除檔案中的#和空行 /etc/selinux/config
[root@oldboyedu-lnb ~]# egrep -v '#|^$' /etc/selinux/config SELINUX=disabled SELINUXTYPE=targeted
第三個擴充套件正則: {}
方法一: {n,m}前一個字元至少連續出現n次 最多出現m次
示例1: 8出現最少1次最多兩次
8出現最少2次最多3次
方法二: 8{3} 最多顯示多少次
示例1: 8最多顯示2次(只匹配兩次)
第四個擴充套件正則: ()
()表示一個整體 反向引用/後向引用(sed 使用)
正確的寫法
錯誤的寫法: 包含lizheny或者qa的行
取出正確的身份證號碼
[]{}
問題1
[root@oldboy~]# 孔 150000123874591242 夏 222113859123487192 趙 37142518322922103X 大 37142X183229221032
問題2:查詢18位身份證號碼對應的人
問題3: 只查詢3714開頭的身份證號碼
查詢3714開頭的身份證號碼
使用正則獲取當前系統的IP地址
[root@oldboyedu-lnb ~]# ifconfig eth0|head -n2 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.0.200 netmask 255.255.255.0 broadcast 10.0.0.255 [root@oldboyedu-lnb ~]# ifconfig eth0|head -n2|tail -1 inet 10.0.0.200 netmask 255.255.255.0 broadcast 10.0.0.255 [root@oldboyedu-lnb ~]# ifconfig eth0|grep inet inet 10.0.0.200 netmask 255.255.255.0 broadcast 10.0.0.255 inet6 fe80::20c:29ff:fe7d:ce prefixlen 64 scopeid 0x20<link> [root@oldboyedu-lnb ~]# ifconfig eth0|grep '\binet\b' inet 10.0.0.200 netmask 255.255.255.0 broadcast 10.0.0.255 方法一: [root@oldboyedu-lnb ~]# ifconfig eth0|grep '\binet\b'|egrep '[0-9.]+' -o 10.0.0.200 255.255.255.0 10.0.0.255 方法二:[root@oldboyedu-lnb ~]# ifconfig eth0|grep '\binet\b'|egrep '[0-9]+.[0-9]+.[0-9]+.[0-9]+' -o 10.0.0.200 255.255.255.0 10.0.0.255 [root@oldboyedu-lnb ~]# ifconfig eth0|grep '\binet\b'|egrep '([0-9]{1,3}.){3}[0-9]+' -o 10.0.0.200 255.255.255.0 10.0.0.255