文件內容查找(一)grep正則表達式
grep的工作方式是這樣的,它在一個或多個文件中搜索字符串模板。如果模板包括空格,則必須被引用,模板後的所有字符串被看作文件名。搜索的結果被送到屏幕,不影響原文件內容。
grep可用於shell腳本,因為grep通過返回一個狀態值來說明搜索的狀態,如果模板搜索成功,則返回0,如果搜索不成功,則返回1,如果搜索的文件不存在,則返回2。我們利用這些返回值就可進行一些自動化的文本處理工作。
grep -[acinvo] '搜索內容串' filename
1.對文本進行行過濾
-v--對其匹配到的行取反
-i--忽略大小寫
-n 顯示匹配到的行號
-c 匹配的行數
-o 僅顯示匹配到的字符串
-q 靜默 不輸出任何信息 與echo $? ——> 0有 1無
-W 匹配整個單詞 ---- 單詞不能接數字、字母、漢字、下劃線(_) 否則不能算完整單詞
-A,B,C後面數字
2.元字符分類:字符匹配、匹配次數、位置錨定、分組
字符匹配:
. 匹配任意單個字符
[] 匹配指定範圍內的任意單個字符 [ ]內字符不用轉義如. /
[^] 匹配指定範圍外的任意單個字符
[:alnum:] 字母和數字
[:alpha:] 代表任何英文大小寫字符,亦即 A-Z, a-z
[:lower:] 小寫字母
[:upper:]
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的範圍廣)
[:cntrl:] 不可打印的控制字符(退格、刪除、警鈴...)
[:digit:] 十進制數字 [:xdigit:]十六進制數字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 標點符號
匹配次數:用在要指定次數的字符後面,用於指定前面的字符要出現的次數
* 匹配前面的字符任意次,包括0次 貪婪模式:盡可能長的匹配
.* 任意長度的任意字符
\? 匹配其前面的字符0或1次
\+ 匹配其前面的字符至少1次
\{n\} 匹配前面的字符
\{m,n\} 匹配前面的字符至少m次,至多n次
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次
位置錨定:定位出現的位置
^ 行首錨定,用於模式的最左側
$ 行尾錨定,用於模式的最右側 ^PATTERN$ 用於模式匹配整行
^$ 空行 ^[[:space:]]*$ 空白行
\< 或 \b 詞首錨定,用於單詞模式的左側
\> 或 \b 詞尾錨定;用於單詞模式的右側 \<PATTERN\> 匹配整個單詞
分組:
\(\) 將一個或多個字符捆綁在一起,當作一個整體進 行處理,如:\(root\)\+ v
分組括號中的模式匹配到的內容會被正則表達式引擎記錄於 內部的變量中,這些變量的命名方式為: \1, \2, \3, ... v\1 表示從左側起第一個左括號以及與之匹配右括號之間的 模式所匹配到的字符 v 示例: \(string1\+\(string2\)*\) \1 : string1\+\(string2\)* \2 :string2 v
後向引用:引用前面的分組括號中的模式所匹配字符,而非 模式本身 v 或者:\| 示例:a\|b: a或b C\|cat: C或cat \(C\|c\)at:Cat或cat
這裏列出幾個擴展特殊符號:
+,於 . * 作用類似,表示 一個或多個重復字符。
?, 於 . * 作用類似,表示0個或一個字符。
|,表示或關系,比如 'gd|good|dog' 表示有gd,good或dog的串
(),將部分內容合成一個單元組。比如 要搜索 glad 或 good 可以這樣 'g(la|oo)d'
()的好處是可以對小組使用 + ? * 等。
比如要搜索A和C開頭結尾,中間有至少一個(xyz) 的串,可以這樣 : 'A(xyz)+C'
示例
1.顯示/proc/meminfo文件中以大小s開頭的行(要求:使用兩 種方法)
[root@zab ~]# egrep -i ^[s] /proc/meminfo
egrep "^[sS]" /proc/meminfo
2.顯示/etc/passwd文件中不以/bin/bash結尾的行
egrep -v "/bin/bash$" /etc/passwd
3.找出/etc/passwd中的兩位或三位數
[root@centos7 ~]#grep "\<[[:digit:]]\{2,3\}\>" /etc/passwd
egrep "[0-9]{2,3}\>" /etc/passwd
4.顯示用戶rpc默認的shell程序
[root@centos7 ~]# cat /etc/passwd |egrep "\<rpc\>" |cut -d: -f7
grep -w "^rpc" /etc/passwd |cut -d: -f7
grep "^rpc\>" /etc/passwd |cut -d: -f7
5.顯示CentOS7的/etc/grub2.cfg文件中,至少以一個空白 字符開頭的且後面存非空白字符的行
[root@centos7 ~]# egrep "^[[:space:]]{1,}[^[:space:]"] /etc/grub2.cfg
[root@centos7 ~]# egrep "^[[:space:]]+[^[:space:]]" /etc/grub2.cfg
6.找出“netstat -tan”命令的結果中以‘LISTEN’後跟任意多 個空白字符結尾的行
netstat -tan | grep "\(LISTEN\)\[[:space:]]*$"
[root@centos7 ~]# netstat -tan |egrep "(LISTEN)[[:space:]]*$"
7.顯示CentOS7上所有系統用戶的用戶名和UID
[root@centos7 ~]# cat /etc/passwd|egrep "\<[0-9]{1,3}\>"|cut -d: -f1,3
註:在centos7上系統用戶的uid為0-999
[root@centos7 ~]# cat /etc/passwd|egrep "\<[0-9]{1,3}\>"|cut -d: -f1,3
[root@centos7 ~]# cut -d: -f1,3 /etc/passwd |egrep "\<[[:digit:]]{1,3}$"
8.添加用戶bash、testbash、basher、sh、nologin(其shell 為/sbin/nologin),找出/etc/passwd用戶名同shell名的行
[root@centos7 ~]# cat /etc/passwd |egrep "^([[:alnum:]]+\>).*\1$"
[root@centos7 ~]# cat /etc/passwd |egrep "^([a-zA-Z]+\>).*\1$" shell類型只含字母
9.利用df和grep,取出磁盤各分區利用率,並從大到小排序
[root@centos7 ~]# df -h |egrep "^/dev/sda" |egrep -o "([0-9]{,2}|100)%"
[root@centos7 ~]# df |grep "^/dev/sd" | grep -o "\<[[:digit:]]\+%" |sort -nr|tr -d "%"
10.顯示三個用戶root、mage、wang的UID和默認shell默認shell
[root@centos7 ~]# cat /etc/passwd |egrep "^(mage|wang|root)\>"|cut -d: -f1,7
11.找出/etc/rc.d/init.d/functions文件中行首為某單詞(包 括下劃線)後面跟一個小括號的
[root@centos7 ~]# cat /etc/rc.d/init.d/functions|egrep "^[[:alnum:]|_]{1,}\(\)"
12.使用egrep取出/etc/rc.d/init.d/functions中其基名
[root@centos7 ~]# echo /etc/rc.d/init.d/functions|egrep -o "[^/]+$"
13.使用egrep取出上面路徑的目錄名
[root@centos7 ~]# echo /etc/rc.d/init.d/functions|egrep -o "^/.*/\<"
14.統計last命令中以root登錄的每個主機IP地址登錄次數
[root@centos7 ~]# last|egrep -w "root"|egrep "([0-9]{1,3}\.){3}[0-9]{1,3}"|tr -s ' '|cut -d' ' -f1,3|sort |uniq -c
15.利用擴展正則表達式分別表示0-9、10-99、100-199、 200-249、250-255 v
[0-9] [1-9][0-9] 1[0-9][0-9] 2[0-4][0-9] 25[0-5]
16.顯示ifconfig命令結果中所有IPv4地址
[root@centos7 ~]# ifconfig| egrep "\<(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
17.將此字符串:welcome to magedu linux 中的每個字符 去重並排序,重復次數多的排到前面
[root@zab ~]# echo "welcome to magedu linux" |egrep -o "." |sort |uniq -c
18.用正則表達式表示手機號11 13 17 15 18
[root@centos7 ~]# egrep "1[3758][0-9]{9}"
文件內容查找(一)grep正則表達式