grep, egrep及相應的正則表達式用法詳解

    Linux的哲學思想一切皆文件(包括硬件);使用文本文件保存程序的配置數據;掌握一種強大的文本搜索工具將是linux運維人員的的必備技能,grep全稱 (Globel Search REgular Expression and Printing out the line)全局搜索正則表達式並匹配到的行打印出來)是Linux系統中一種強大的文本搜索工具,能根據用戶指定的文本模式(正則表達元字符以及正常字符組合而成)對目標文件進行逐行搜索,並把匹配到的顯示到屏幕;不影響原文件內容;grep家族包括 有grep、egrep和fgrep(fgrep:不支持正則表達式;搜索速度更快)。 egrep表示擴展的grep,比grep支持更多的元字符,
grep 使用格式:
    grep [OPTIONS] PATTERN [FILE...]
    grep  選項  模式  文件
    #grep 在搜索的模式中含有空白字符必須使用引號;單引和雙引號都可以;grep模式中如果包含變量的時候必須加雙引號
grep 常用選項
     --color[=WHEN], --colour[=WHEN]  : 搜索到匹配的文本時進行語法着色,可將grep --color=auto 定義爲alias
        --color=auto : 自動爲語法着色
     例子:grep --color=auto "root" /etc/passwd
    -o: 只顯示被模式匹配到的內容,而不是整個行
    -i: ignore case,匹配時不區分字符大小寫
    -v: 反向選取,顯示不能夠被模式匹配到的行
    -E:使用擴展的正則表達式
    -A #:匹配到的行時,並顯示該行後面的#行(#表示數值)
    -B #:匹配到的行時,並顯示該行前面的#行(#表示數值)
    -C # 匹配到的行時,並顯示該行前後的各#行(#表示數值)

正則表達式:REGular EXPression REGEXP
    正則表達式是什麼? 正則表達又一些是由元字符及正常字符所書寫的模式,其中的元字符不表示字符本身的意義,而是用於表達控制或通配等功能;這就是grep的搜索模式(Pattern)做爲過濾文本的條件。
正則表達式分爲:
  基本正則表達式 : grep
  擴展正則表達式: grep -E, egrep

基本正則表達式元字符:
 字符匹配:(通常只用於匹配單個字符)
    . : 匹配任意單個字符
    [] :  匹配指定範圍內的任意單個字符
    [^] :  匹配指定範圍外的任意單個字符
    [0-9], [[:digit:]] : 所有數字
    [^0-9], [^[:digit:]] :  出數字以外的其他字符
    [a-z], [[:lower:]] :所有的小寫字母
    [A-Z], [[:upper:]] :所有的大寫字母
    [a-zA-Z], [[:alpha:]] :所有的字母
    [0-9a-zA-Z], [[:alnum:]]  : 所有的數字和字母
    [[:space:]] : 空白字符
    [[:punct:]] : 所有標點符號

顯示 /etc/rc.d/rc.sysinit  文件中,以大寫C或c後面跟了a的行

# grep '[cC]a' /etc/rc.d/rc.sysinit

顯示 /etc/rc.d/rc.sysinit  文件中,以大寫N或小寫n後面跟任意單個字符的行

# grep '[Nn].' /etc/rc.d/rc.sysinit

顯示 /etc/rc.d/rc.sysinit  文件中,以大寫N或小寫n後面跟一個非字母的行

# grep '[Nn][^[:alpha:]]' /etc/rc.d/rc.sysinit

次數匹配:在期望匹配字符後面提供一個控制符,用於表達匹配其前面字符指定的次數
    *  : 匹配其前字符任意長度,表示0次、1次或多次;
    .* : 任意長度的任意字符;此時工作於貪婪模式(儘可能長的匹配)
    \? :匹配其前字符0次或1次;(表示其左側字符可有可無)
    \+ : 匹配其前字符1次或多次;(表示其左側字符至少出現1次)
    \{m\} :表示其前字符精確出現m次;
    \{m,n\} :其前字符至少出現m次,最多出現n次;
    \{0,n\} :其前字符至多出現n次;
    \{m,\} :其前字符至少出現m次
 
顯示/etc/passwd中,roo後跟了t,t只出現0次或一次的行

# grep "root\?" /etc/passwd

顯示/etc/passwd中,r後跟了o後跟了t,o至少出現1次的行

# grep "ro\+t" /etc/passwd

顯示/etc/passwd中,r後跟了o,o只出現2次的行

# grep --color "ro\{2\}" /etc/passwd

顯示/etc/passwd中,r後跟了o,o出現至少1次至多2次的行

# grep --color "ro\{1,2\}" /etc/passwd

位置錨定:
    ^: 錨定行首;使用格式:^WORD
    $: 錨定行尾;使用格式:WORD$
    ^PATTERN$:用模式來匹配整行;
    ^$ : 匹配空白行(空白行不等同於空白字符行);
    單詞錨定 :由非特殊字符組成的連續的字符串
    \< :錨定詞首,也可用\b ;使用格式: \<PATTERN 或\bPATTERN
    \> :錨定詞尾,也可以用\b ;使用格式: PATTERN\>或PATTERN\b
    \<PATTERN\>:匹配PATTERN能匹配到的整個單詞
分組:\(\)
    注意:分組中的模式,在某次的具體匹配過程中所匹配到的字符,可以被grep記憶(保存於內置的變量中,這些變量是\1, \2, ...),因此,還可以被引用;
    \1: 引用,模式中自左向右,由第一個左括號以及與之對應的右括號中的模式所匹配到的內容;
    \2: 引用 ,模式中自左右,由第二個左括號以及與之對應的右括號中的模式所匹配到的內容
顯示/etc/passwd文件,以sh開頭的行

# grep "^sh" /etc/passwd

顯示/etc/passwd文件,以sh開頭中間跟了任意字符後以sh結尾的行

# grep "^sh.*sh$" /etc/passwd

顯示/etc/rc.d/rc.sysinit 文件,以空白字符開頭,空白字符出現任意次的行

# grep "^[[:space:]]*$" /etc/rc.d/rc.sysinit

顯示/etc/rc.d/rc.sysinit 文件,空白行(行中不包含任意字符的行)

# grep "^$" /etc/rc.d/rc.sysinit

顯示/etc/passwd文件,以sh作爲單詞詞首的行

# grep "\<sh" /etc/passwd #等同於 # grep "\bsh" /etc/passwd

顯示/etc/passwd文件,以sh作爲單詞詞尾的行

# grep "sh\>" /etc/passwd #等同於 # grep "sh\b" /etc/passwd

從ifconfig命令結果中取得兩位的數字

# ifconfig | grep "\<[[:digit:]]\{2\}\>"

顯示/etc/rc.d/rc.sysinit 文件中以大寫N或小寫n後面了跟了任意個非字母的行

# grep "[Nn][^[:alpha:]]*" /etc/rc.d/rc.sysinit

顯示/proc/meminfo文件中以大寫或小寫S開頭的行;用兩種方式;

# grep "^[sS]" /proc/meminfo
# grep -i "^s" /proc/meminfo

顯示/etc/passwd文件中其默認shell爲非/sbin/nologin的用戶;

# grep -v "/sbin/nologin$" /etc/passwd | cut -d: -f1

顯示/etc/passwd文件中其默認shell爲/bin/bash的用戶;

# grep "/bin/bash$" /etc/passwd | cut -d: -f1

找出/etc/passwd文件中的一位數或兩位數;

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

顯示/boot/grub/grub.conf中以至少一個空白字符開頭的行;

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

顯示/etc/rc.d/rc.sysinit文件中以#開頭,後面跟至少一個空白字符,而後又有至少一個非空白字符的行;

# grep "^#[[:space:]]\+[^[:space:]]\+" /etc/rc.d/rc.sysinit

打出netstat -tan命令執行結果中以‘LISTEN’,後或跟空白字符結尾的行;

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

添加用戶bash, testbash, basher, nologin (此一個用戶的shell爲/sbin/nologin),而後找出當前系統上其用戶名和默認shell相同的用戶的信息;

# useradd -s /sbin/nologin nologin <--指定nologin用戶的默認shell 爲/sbin/nologin
# grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd
# grep "^\(.*\):.*\1$" /etc/passwd

擴展的正則表達式:
字符匹配:(和基本正則表達式表示的含義一直)
    . : 匹配任意單個字符
    [] :匹配指定範圍內的任意單個字符
 [^] :匹配指定範圍外的任意單個字符
次數匹配:
    *: 匹配其前字符任意長度,表示0次、1次或多次;
    ?:匹配其前字符0或1次
    +: 匹配其前字符至少1次
    {m}:精確匹配匹配其前字符m次;
    {m,n}:匹配其前字符至少m次,至多次;
    {m,}:匹配其前字符至少m次;
位置錨定:
    ^ :錨定行首;使用格式:^WORD
    $ :錨定行尾;使用格式:WORD$
    \<, \b :錨定詞首,也可用\b ;使用格式: \<PATTERN 或\bPATTERN
    \>, \b :錨定詞尾,也可以用\b ;使用格式: PATTERN\>或PATTERN\b
分組:\(\)
    注意:分組中的模式,在某次的具體匹配過程中所匹配到的字符,可以被grep記憶(保存於內置的變量中,這些變量是\1, \2, ...),因此,還可以被引用;
    \1: 引用,模式中自左向右,由第一個左括號以及與之對應的右括號中的模式所匹配到的內容;
    \2: 引用 ,模式中自左右,由第二個左括號以及與之對應的右括號中的模式所匹配到的內容
或者:
    a|b:a或者b
    或者是匹配|兩側的所有內容;

支持擴展的正則表達式命令:grep -E PATTERN FILE... ;egrep PATTERN FILE...

使用echo命令輸出一個絕對路徑,使用grep取出其基名;
擴展:取出其路徑名

# echo /etc/rc.d/init.d/functions | grep -o -E "[[:alnum:]]+/?$" | cut -d/ -f1

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

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

寫一個模式,能匹配合理的IP地址;
1.0.0.1 -- 239.255.255.255

# grep -E "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-3][0-9])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
# grep -E "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-3][0-9])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>" ip.txt




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