1. 程式人生 > >文件內容查找(一)grep正則表達式

文件內容查找(一)grep正則表達式

linux文件

功能:輸入文件的每一行中查找字符串。並把匹配的行打印出來。

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 貪婪模式:盡可能長的匹配

.* 任意長度的任意字符

\? 匹配其前面的字符01

\+ 匹配其前面的字符至少1

\{n\} 匹配前面的字符

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: ab C\|cat: Ccat \(C\|c\)at:Catcat

這裏列出幾個擴展特殊符號:

+,於 . * 作用類似,表示 一個或多個重復字符。

? . * 作用類似,表示0個或一個字符。

|,表示或關系,比如 'gd|good|dog' 表示有gd,gooddog的串

(),將部分內容合成一個單元組。比如 要搜索 glad good 可以這樣 'g(la|oo)d'

()的好處是可以對小組使用 + ? * 等。

比如要搜索AC開頭結尾,中間有至少一個(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上系統用戶的uid0-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.添加用戶bashtestbashbashershnologin(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.利用dfgrep,取出磁盤各分區利用率,並從大到小排序

[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.顯示三個用戶rootmagewangUID和默認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-910-99100-199 200-249250-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正則表達式