grep的使用及正則表達(dá)式

2016年9月4日00:10:44 發(fā)表評(píng)論 3,956 ℃

linux 上文本處理三劍客:

grep ,egrep, fgrep:文本過濾工具(模式:pattern);

grep:基本正則表達(dá)式 -E支持?jǐn)U展 ,-F

egrep:擴(kuò)展正則表達(dá)式 -G支持基本 -F

fgrep: 不支持正則表達(dá)式

sed:steam editor, 流編輯器;文本編輯工具;

awk:linux上的實(shí)現(xiàn)為gawk,文本報(bào)告生成器(格式化文本);

正則表達(dá)式:Regual Expression,REGEXP

由一類特殊字符及文本字符所編寫的模式,其中有些字符不表示其字面意義,而是用于表示控制或通配的功能;

分兩類:

基本正則表達(dá)式:BRE

擴(kuò)展正則表達(dá)式:ERE

元字符:\(hello[[:space:]]\+\)\+

grep:Global search REgular expression and print out the line.

作用:文本搜索工具,根據(jù)用戶指定的“模式(過濾條件)”對(duì)目標(biāo)文件逐行進(jìn)行匹配檢查;打印匹配到的行;

模式:由正則表達(dá)式的元字符所編寫的過濾條件

正則表達(dá)式引擎:

grep [OPTIONS] PATTERN [FILE...]

grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

--color=auto:對(duì)匹配到的文本著色后高亮顯示

-i:ignorecase,忽略字符的大小寫;

-o:僅顯示匹配到的字符本身

-v:--invert-match:顯示不能被匹配的行

-E:支持使用擴(kuò)展的正則表達(dá)式字符

-q:--quiet, --silent:靜默模式,即不輸出任何信息

-A#after,后#行

-B#before,前#行

-C#context,前后#行

基本正則表達(dá)式元字符:

字符匹配:

.:匹配任意單個(gè)字符

[]:匹配指定訪問內(nèi)的任意單個(gè)字符

[^]匹配指定訪問外的任意單個(gè)字符

[:digit:] [:lower:] [:upper:] [:alpha:] [:alnum:] [:punct:] [:space:]

匹配次數(shù):用在要指定其出現(xiàn)的次數(shù)的字符的后面,用于限制其前面字符出現(xiàn)的次數(shù);默認(rèn)工作于貪婪模式

*:匹配其前面的字符任意次:0,1,多次

.*:配置任意長(zhǎng)度的任意字符

\?:匹配其前面的字符0次或1次,即其前面的字符是可有可無(wú)

\+:匹配其前面的字符1次或多次;即前面的字符要出現(xiàn)至少1次

\{m\}:匹配其前面的字符m次

\{m,n\}:匹配其前面的字符至少m次,至多n次

\{0,n\}:至多n次

\{m,\}:至少m次

位置錨定:

^:行首錨定;用于模式的最左側(cè);

$:行尾錨定;用于模式的最右側(cè);

^PATTERN$:用于PATTERN來(lái)匹配整行

^$:空白行;

^[[:space:]]*$:空行或包含空白字符的行

單詞:非特殊字符組成的連續(xù)字符(字符串),都稱為單詞

\<或\b:詞首錨定,用于單詞模式的左側(cè)

\>或\b:詞尾錨定,用于單詞模式的右側(cè)

\<pattern\>:匹配完整 單詞

練習(xí):1、顯示/etc/passwd文件中不以/bin/bash結(jié)尾的行

grep -v "\/bin/bash$" /etc/passwd

2、找出/etc/passwd文件中兩位數(shù)或者三位數(shù)

grep  "\<[0-9]\{2,3\}\>" /etc/passwd

3、找出/etc/rc.d/rc.syinit或/etc/grub.cfg文件 中,以至少一個(gè)空白字符開頭,且后面非空白字符的行 

grep "^[[:space:]]\+[^[:space:]]" /etc/grub.conf 

4、找出“netstat -tan”命令的結(jié)果中以LISTEN后跟0、1或多個(gè)空白字符結(jié)尾的行;

netstat -tan | grep  "LISTEN[[:space:]]*$"

分組及引用:

\(\):將一個(gè)或多個(gè)字符捆綁在一起

\(xy\)*ab

Note:分區(qū)括號(hào)中的模式匹配到的內(nèi)容會(huì)被正則表達(dá)式引擎自動(dòng)記錄與內(nèi)部的變量中,這些變量為:

\1:模式從左側(cè)起,第一個(gè)左括號(hào)以及與之匹配的右括號(hào)之間的模式所匹配的字符

\2:模式從左側(cè)起,第二個(gè)左括號(hào)以及與之匹配的右括號(hào)之間的模式所匹配的字符

\3:

...

grep "\(r..t\).*\1" /etc/passwd

后向引用:引用前面的分組括號(hào)中的模式所匹配到的字符;

egrep:

支持?jǐn)U展的正則表達(dá)式實(shí)現(xiàn)類似于grep文本過濾功能:grep -E

egrep [OPTIONS] PATTERN [FILE...]

選項(xiàng)-i,-o,-v,-q,-A,-B,-C

-G:支持基本正則表達(dá)式

擴(kuò)展正則表達(dá)式的元字符:

字符匹配:

.:任意單個(gè)字符

[]:指定訪問內(nèi)的任意單個(gè)字符

[^]: 指定訪問外的任意單個(gè)字符

次數(shù)匹配:

*:任意次,0,1,多次

?:0次或1次,其前的字符是可有可無(wú)的

+:其前字符至少1次

{m}: 其前的字符m次

{m,n}至少m次,至多n次

{0,n}

{m,}

位置錨定:

^:行首錨定

$:行尾錨定

\<,\b詞首錨定

\>,\b詞尾錨定

分組及引用:

():分組;括號(hào)內(nèi)的模式匹配到的字符會(huì)被記錄于正則表達(dá)式引擎內(nèi)部變量中;

后向引用:\1,\2,\3

或:

a|b :a或者b

C|cat:C或者cat

(C|c)at:C或者c

練習(xí):

1、找出/proc/meminfo文件中,所有大寫或小寫s開頭的行;至少有三種實(shí)現(xiàn)方式。

grep "^[Ss]" /proc/meminfo

grep -i "^s" /proc/meminfo

grep -E "^(S|s)" /proc/meminfo

2、顯示目前系統(tǒng)上root、centos或user1用戶的相關(guān)信息

grep -E "^root|mysql|user3\>" /etc/passwd

3、找出/etc/rc.d/init.d/functions文件中某單詞后面跟一個(gè)小括號(hào)的行

grep -E "[^[:punct:]]+\(\)" /etc/rc.d/init.d/functions

grep -E -o "[_[:alnum:]]+\(\)" /etc/rc.d/init.d/functions

4、使用echo命令輸出一絕對(duì)路徑,使用egrep取出其名

echo /www/mysql_data/mysql-bin.000001/ | grep  -E -o "[^/]+/?$"

進(jìn)一步;取其路徑名;類似于對(duì)其之星dirname的結(jié)果。

5、找出ifconfig命令結(jié)果中的1-255之間的數(shù)值

ifconfig | grep -E "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"

6、課外作業(yè):找出ifconfig命令結(jié)果中的IP地址

ifconfig eth0 | awk '/Mask/{split($2,ip,":");print ip[2]}'

ifconfig eth0 | cut -d: -f2 | awk '(NR==2){print $1}'

7、添加用戶bash,testbash,basher以及nologin(其shell為/sbin/nologin);而后找出/etc/passwd文件中用戶名為同shell名的行

grep -E "(^[^:]+\>).*\1$" /etc/passwd

fgrep:不支持正則表達(dá)式元字符;

當(dāng)無(wú)需要用到元字符去編寫模式時(shí),使用fgrep性能更好

文本查看及處理工具:wc , cut ,sort , uniq ,diff ,patch

wc:word count

wc [OPTION]... [FILE]...

-l:lines

-w:words

-c:bytes

cut

cut OPTION... [FILE]...

OPTION

-d CHAR:為指定的字符為分隔符

-f FIELDS:挑選出的字段

 #:指定的單個(gè)字段

#-#:連續(xù)的多個(gè)字段

#,#:離散的多個(gè)字段

sort:

sort [OPTION]... [FILE]...

-n :基于數(shù)值大小排序

-t CHAR:指定分隔符;

-k #:用于排序比較的字段

-r:逆序排序

-f:忽略字符大小寫

-u:重復(fù)的行只保留一份

重復(fù)行:連續(xù)且相同

uniq:報(bào)告或移除重復(fù)的行

uniq [OPTION]... [INPUT [OUTPUT]]

-c:顯示每行的重復(fù)次數(shù)

-u:僅顯示未曾重復(fù)過的行

-d:僅顯示重復(fù)過的行

diff:逐行比較文本內(nèi)容

diff [OPTION]... FILES

diff /path/to/oldfle /path/to/newfile >/path/to/patch_file

-u使用unfied機(jī)制,即顯示要修改的行的上下文,默認(rèn)為3行

patch:向文件打補(bǔ)丁

patch [OPTIONS] -i /path/to/patch_file/patch/to/oldfile

patch /path/to/oldfile < /path/to/patch_file

練習(xí):取出ifconfig eth0 命令結(jié)果中的ip地址。

ifconfig eth0 | cut -d: -f2 | awk '(NR==2){print $1}

【騰訊云】云服務(wù)器、云數(shù)據(jù)庫(kù)、COS、CDN、短信等云產(chǎn)品特惠熱賣中

發(fā)表評(píng)論

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: