正則表達式用法


正則表達式:Regular Expression, REGEX

分兩類:

基本正則表達式:BRE 

擴展正則表達式:ERE

grep家族:

grep: Global search REgular expression and Print out the line. 支持使用基本正則表達式;

egrep:支持使用擴展正則表達式;

fgrep:不支持使用正則表達式;

grep命令:

作用:文本搜索工具,根據用戶指定的”pattern(過濾條件)“對目標文本逐行進行匹配檢查;打印出符合條件的行;

模式:由文本字符及正則表達式元字符所編寫的過濾條件;

常用選項:

--color=auto:對匹配到的文本着色後高亮顯示;

-i:忽略字符大小寫;

-o:僅顯示匹配 到的文本自身;

-v, --invert-match:反向匹配;

-E:支持擴展的正則表達式;

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

基本正則表達式元字符:

字符匹配:

.:匹配任意單個字符;

[ ]:匹配範圍內的任意單個字符;

[^ ]:匹配範圍外的任意單個字符;

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

man 7 glob

匹配次數:

用在要指定其出現的次數的字符後面,用限制其前面的字符要出現的次數;默認工作於貪婪模式;

*:匹配前面的字符任意次(0,1或多次);

grep "x*y":

xxxyabc

yabc

abcxy

abcy

.*:任意長度的任意字符;

\+:匹配前面的字符至少1次;

grep "x\+y":

xxxyabc

yabc

abcxy

abcy

\?:匹配前面的0次或1次,即前面的字符可有可無;

grep "x\?y":

xxxyabc

yabc

abcxy

abcy

\{m\}:其前面的字符出現m次,m爲非負整數;

grep "x\{2\}y":

xxxyabc

yabc

abcxy

abcy

\{m,n\}:其前面的字符出現m次,m爲非負整數;[m,n]

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

\{m,\}:至少m次;

位置錨定

限制使用模式搜索文本,限制模式所匹配到的文本只能出現於目標文本的哪個位置;

^:行首錨定;用於模式的最左側,^PATTERN

$:行尾錨定;用於模式的最右側,PATTERN$

^PATTERN$:要讓PATTERN完全匹配一整行;

^$:空行;

^[[:space:]]*$:

單詞:由非特殊字符組成的連續字符(字符串)都稱爲單詞;


\<或\b:詞首錨定,用於單詞模式的左側,格式爲\<PATTERN, \bPATTERN

\>或\b:詞尾錨定,用於單詞模式的右側,格式爲PATTERN\>, PATTERN\b

\<PATTERN\>:單詞錨定;

實例:

1、顯示/etc/passwd文件中不以bash結尾的行;

~]# grep -v "bash$" /etc/passwd

2、找出/etc/passwd文件中的三位或四位數;

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

3、找出/etc/grub2.cfg文件中,以至少一個空白字符開頭,後面又跟了非空白字符的行;

~]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg

4、找出"netstat  -tan”命令的結果中,以‘LISTEN’後跟0或多個空白字符結尾的行;

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

5、找出"fdisk  -l“命令的結果中,包含以/dev/後跟sd或hd及一個小字母的行;

~]# fdisk -l | grep "/dev/[sh]d[a-z]\>"

6、找出”ldd  /usr/bin/cat“命令的結果中文件路徑;

~]# ldd /usr/bin/cat | grep -o "/[^[:space:]]\+"

分組與引用:

\(PATTERN\):將此PATTERN匹配到的字符當作一個不可侵害整體進行處理;

Note:分組括號中的模式匹配到的字符會被正則表達式引擎自動記錄於內部的變量中,這些變量是\1, \2, \3, ...

pat1\(pat2\)pat3\(pat4\(pat5\)pat6\)

\n:模式中第n個左括號以及與之匹配的右括號之間的模式所匹配到的字符串;(不是模式,而是模式匹配的結果)

\1:第一組括號中的pattern匹配到的字符串;

\2:第二組括號中的pattern匹配到的字符串;

……

He love his lover.

He like his lover.

He love his liker.

He like his liker.

l..e.*l..er

\(l..e\).*\1r

後向引用:引用前面的括號中的模式所匹配到的字符串;

常用選項之二:

-E, --extended-regexp:支持使用擴展正則表達式

-F, --fixed-strings:支持使用固定字符串,不支持正則表達式,相當於fgrep;

-G, --basic-regexp:支持使用基本正則表達式;

-P, --perl-regexp:支持使用pcre正則表達式;

-e PATTERN, --regexp=PATTERN:多模式機制;

-f FILE, --file=FILE:FILE爲每行包含了一個pattern的文本文件,即grep script;

-A NUM, --after-context=NUM

-B NUM, --before-context=NUM

-C NUM, -NUM, --context=NUM

egrep:

支持使用擴展正則表達式的grep命令,相當於grep -E;

egrep [OPTIONS] PATTERN [FILE...]

擴展正則表達式的元字符:

字符匹配:

.:任意單個字符

[ ]:範圍內的任意單個字符

[^ ]:範圍外的任意單個字符

匹配次數:

*:任意次;

?:0次或1次;

+:1次或多次;

{m}:匹配m次;

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

{0,n}

{m,}

位置錨定:

^:行首

$:行尾

\<, \b:詞首

\>, \b:詞尾

分組及引用:

(pattern):分組,括號中的模式匹配到的字符會被記錄於正則表達式引擎內部的變量中;

後向引用:\1, \2, ...

或者:

a|b:a或者b

C|cat:表示C或cat

(C|c)at:表示Cat或cat

實例:

1、顯示/etc/passwd文件中不以bash結尾的行;

~]# egrep -v "bash$" /etc/passwd

2、找出/etc/passwd文件中的三位或四位數;

~]# egrep "\<[0-9]{3,4}\>" /etc/passwd

3、找出/etc/grub2.cfg文件中,以至少一個空白字符開頭,後面又跟了非空白字符的行;

4、找出"netstat  -tan”命令的結果中,以‘LISTEN’後跟0或多個空白字符結尾的行;

5、找出"fdisk  -l“命令的結果中,包含以/dev/後跟sd或hd及一個小字母的行;

6、找出”ldd  /usr/bin/cat“命令的結果中文件路徑;

7、找出/proc/meminfo文件中,所有以大寫或小寫s開頭的行;至少用三種方式實現;

~]# egrep "^(s|S)" /tmp/meminfo

~]# grep "^[sS]" /tmp/meminfo

~]# grep -i "^s" /tmp/meminfo

8、顯示當前系統上root、centos或slackware用戶的相關信息;

~]# egrep "^(root|centos|slackware)\>" /etc/passwd

9、echo輸出一個絕對路徑,使用egrep取出其基名;

~]# echo /etc/passwd/ | egrep -o "[^/]+/?$"

10、找出ifconfig命令結果中的1-255之間的整數;

~]# ifconfig | egrep "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"

11、添加用戶bash、testbash、basher及nologin,要求前三個用戶的默認shell爲/bin/bash,nologin的默認shell爲/sbin/nologin,而後找出其用戶名與shell名相同的用戶;

~]# egrep "^([[a-z0-9]+)\>.*\1$" /etc/passwd


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章