基本正則表達式元字符:git
字符匹配:正則表達式
.: 匹配任意單個字符;shell
[]: 匹配指定範圍內的任意單個字符centos
[^]:匹配指定範圍外的任意單個字符bash
[:digit:]: 數字字符ide
[:lower:]: 小寫字母字符spa
[:upper:]: 大寫字母,等價於[A-Z]it
[:alpha:]: 小寫及大寫字母,等價於[a-zA-Z]io
[:alnum:]: 小寫和大寫字母及數字,等價於[a-zA-Z0-9]function
[:punct:]: 標點符號,包括問號、句號、逗號、冒號、分號、單引號、英文的重音符或中文的間隔號(`)、!、@、#、%、^、&、*、左右括 號、左右中括號、左右大括號、正斜槓(/)、-、_
[:space:]: 空白字符,包括空格、水平製表符、垂直製表符、換行、換頁、回車
匹配次數:用在要指定次數的字符後面,用於指定前面的字符要出現的次數;
*:匹配前面的字符任意次;
例如: grep "x*y"
abxy
xay
xxxxxxy
貪婪模式
.*:任意長度的任意字符;
\?:匹配其前面的字符0或1次;即前面的無關緊要;
\+:匹配其前面的字符至少1次;
\{m\}:匹配前面的字符m次;
\{m,n\}:匹配前面的字符至少m次,至多n次;
\{0,n\}:匹配前面的字符至多n次;
\{m,\}:匹配前面的字符至少m次;
位置錨定:
^:行首錨定;用於模式的最左側;
$:行尾錨定;用於模式的最右側;
^PATTERN$: 用於模式匹配整行;
^$:空行;
^[[:space:]]*$
\< 或 \b:詞首錨定;用於單詞模式的左側;
\> 或 \b:詞尾錨定;用於單詞模式的右側;
\<PATTERN\>:匹配整個單詞;
分組:
\(\):將一個或多個字符捆綁在一塊兒,看成一個總體進行處理;
\(xy\)*ab
Note: 分組括號中的模式匹配到的內容會被正則表達式引擎記錄於內部的變量中,這些變量的命名方式爲: \1, \2, \3, ...
\1: 從左側起,第一個左括號以及與之匹配右括號之間的模式所匹配到的字符;
\(ab\+\(xy\)*\):
\1: ab\+\(xy\)*
\2: xy
後向引用:引用前面的分組括號中的模式所匹配字符,(而非模式自己)
擴展正則表達式的元字符:
字符匹配:
.
[]
[^]
次數匹配:
*
?: 0或1次;
+:1次或屢次;
{m}:匹配m次;
{m,n}:至少m,至多n次;
錨定:
^
$
\<, \b
\>, \b
分組:
()
後向引用:\1, \2, ...
或者:
a|b
C|cat: C或cat
練習:
一、顯示/proc/meminfo文件中以大小s開頭的行;(要求:使用兩種方式)
# grep -i ^s /proc/meminfo
or
# grep ^[sS] /proc/meminfo
二、顯示/etc/passwd文件中不以/bin/bash結尾的行;
# grep -v '/bin/bash$' /etc/passwd
三、顯示/etc/passwd文件中ID號最大的用戶的用戶名;
# sort -t: -k3 -n /etc/passwd | tail -1 | cut -d: -f1
四、若是用戶root存在,顯示其默認的shell程序;
# finger root | grep -i shell | cut -d: -f3
or
# id root &> /dev/null && grep "^root\>" /etc/passwd | cut -d: -f7
or
# grep "^root\>" /etc/passwd | cut -d: -f7
五、找出/etc/passwd中的兩位或三位數;
# grep -o "\<[0-9]\{2,3\}\>" /etc/passwd
六、顯示/etc/rc.d/rc.sysinit文件中,至少以一個空白字符開頭的且後面存非空白字符的行;
# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
七、找出"netstat -tan"命令的結果中以'LISTEN'後跟0、1或多個空白字符結尾的行;
# netstat -tan | grep "LISTEN[[:space:]]*$"
八、添加用戶bash、testbash、basher以及nologin(其shell爲/sbin/nologin);然後找出/etc/passwd文件中用戶名同shell名的行;
# grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd
九、顯示當前系統root、centos或user1用戶的默認shell和UID;
# grep -E '^(root|centos|user1)\>' /etc/passwd | cut -d: -f1,3,7
十、找出/etc/rc.d/init.d/functions文件(centos6)中某單詞後面跟一個小括號的行;
# grep -E -o "^[_[:alpha:]]+\(\)" /etc/rc.d/init.d/functions
十一、使用echo輸出一絕對路徑,使用egrep取出其基名(相似basename命令);
# echo "/mnt/sdc" | grep -E -o "[^/]+/?$" | cut -d"/" -f1
or
# echo "/etc/sysconfig/network/" | egrep -o "\<[[:alpha:]]+\>/?$" | cut -d'/' -f1