1. 程式人生 > >正則表達式及grep

正則表達式及grep

-o gin option graph 查找 pat 區別 passwd MF

一、正則表達式

正則表達式 Regular Expression ,簡稱REGEXP,用來檢索、替換某些符合某個模式的文本。
正則表達式元字符有:

    . :匹配任意單個字符
    [] :匹配指定範圍內的單個字符
    [^] :匹配指定範圍外的 單個字符
    字符集和有(可以使用man grep查看):[:alnum:], [:alpha:], [:cntrl:], [:digit:],  [:graph:],  [:lower:],   [:print:],   [:punct:],   [:space:],   [:upper:],   [:xdigit:]

匹配次數(貪婪模式匹配盡可能多的)

    * :匹配前面的字符任意次數
    \? :匹配前面的字符一次或0次
    \{m,n\} :匹配前面的字符至少m次,最多n次
            列如有字符:a,b,ab,abb,aab,axb,amnb,那麽a*b,a?b,a.*b會匹配到的字符串有:
            a*b(表示a可以出現任意次可以沒有,後面接字符b) :b, ab,abb,aab,axb,amnb
            a\?b(表示a可以出現一次或0次,後面接字符b,問號要轉義) :b,ab,abb,aab,axb,amnb
            a.*b(表示ab之間可以有任意字符):ab,abb,aab,axb,amnb
            a\{1,3\}b(表示a最少出現1次,最多出現3次):ab,abb,aab
            (以上使用grep測試得出)

位置錨定,即匹配指定位置出現的字符串

    ^ :錨定行首,後面出現的字符串只能在行首出現
    $:錨定行尾,後面出現的字符串只能在行尾出現
    ^$:匹配空白行
    \<或\b :其後面出現的字符必須作為單詞的首部出現
    \>或\b :其後面出現的字符必須作為單詞的尾部出現

分組:
\(\):一般和\1,\2,\3一起使用

二、grep

grep:根據模式搜索,並將模式的文本行顯示出來
用法:grep [OPTIONS] PATTERN [FILE...]
PATTERN:是文本字符和元字符組合而成的匹配條件
常用參數:
-i :忽略大小寫
-o :僅顯示匹配到的字符串

-v:取反,顯示匹配到的以外的字符串
--color:將匹配到的字符串顯示顏色
例如:

    新建grep.txt文本,內容如下:
    she like his liker.
    he love she also love.
    he like his lover.
    1.列出符合 l..e 的行(l和e之間占任意兩個字符)

技術分享圖片

    2.只顯示匹配到的字符串 -o

技術分享圖片

    3.忽略大小寫匹配 -i

技術分享圖片

    4.取反 -v

技術分享圖片

    5.顯示/proc/meminfo文件中以不區分大小的s開頭的行;       
    grep -i ‘^s‘ /proc/meminfo
    grep ‘^[sS]‘ /proc/meminfo

    6.顯示/etc/passwd中以nologin結尾的行; 
    grep ‘nologin$‘ /etc/passwd

    7.取出默認shell為/sbin/nologin的用戶列表
    grep "nologin$‘ /etc/passwd | cut -d: -f1

    8.取出默認shell為bash,且其用戶ID號最小的用戶的用戶名
    grep ‘bash$‘ /etc/passwd | sort -n -t: -k3 | head -1 | cut -d: -f1

    9.顯示/etc/inittab中以#開頭,且後面跟一個或多個空白字符,而後又跟了任意非空白字符的行;
    grep "^#[[:space:]]\{1,\}[^[:space:]]" /etc/inittab

    10.顯示/etc/inittab中包含了:一個數字:(即兩個冒號中間一個數字)的行;
    grep ‘:[0-9]:‘ /etc/inittab

    11.顯示/boot/grub/grub.conf文件中以一個或多個空白字符開頭的行;
    grep ‘^[[:space:]]\{1,\}‘ /boot/grub/grub.conf

    12.顯示/etc/inittab文件中以一個數字開頭並以一個與開頭數字相同的數字結尾的行;
    grep ‘^\([0-9]\).*\1$‘ /etc/inittab

    13.找出/proc/cpuinfo文件中的,1位數,或2位數;
    grep ‘[0-9]\{1,2\}‘ /proc/cpuinfo (找出滿足有一位或兩位數字的行)
    grep --color ‘\<[0-9]\{1,2\}\>‘ /proc/cpuinfo (找出滿足有一位或兩位數字的行,且這數字只能是一個單詞)

    14.查找當前系統上名字為student(必須出現在行首)的用戶的帳號的相關信息, 文件為/etc/passwd
    grep ‘^student\>‘ /etc/passwd 
    或者 id student

三、其它

正則表達式用法很靈活,較復雜,更多的用法上百度查找。
正則表達式和通配符的區別,不要搞混淆了,想了解通配符查看“bash及其特性“文檔。

正則表達式及grep