Part 3 grep正則表示式
Grep:
Linux文字處理三劍客
grep: 文字過濾(模式:pattern)工具
Sed: 文字編輯工具
awk:Linux上的實現gawk,文字報告生成器:
正則表示式引擎
選項:
-v: 顯示不能夠被pattern匹配到的行;
-q: 靜默模式,不輸出任何資訊
基本正則表示式元字元
字元匹配:
.: 匹配任意單個字元:
[:digit:]、[:lower:]、[:upper:]、[:alnum:]、[:punct:]、[:space:]、[:alpha:]
匹配次數,用在要指定次數的字元後面,用於指定前面的字元要出現的次數:
*:匹配前面字元任意次
例如:grep "x*y"
abxy
Xay
.*: 任意長度的任意字元
\?: 匹配前面的字元0次或1次
+: 匹配其前面的字元至少1次
{m}: 匹配前面的字元m次
{m,n}:匹配前面的字元至少m次,至多n次
{0,n}; 匹配前面的字元至多n次:
{m,}: 匹配前面的字元至少m次
位置錨定
^: 行首錨定,用於模式的最左側:
$: 行尾錨定:用於模式的最右側
^PATTERN$: 用於模式匹配正行
^$: 空行:
^[[:space:]]*$
\<或\b: 詞首錨定;用於單詞模式的左側;
\>或\b: 詞首錨定;用於單詞模式的右側;
\<PATTERN\>: 匹配整個單詞;
分組:
(): 將一個或多個字元捆綁在一起,當作一個整體進行處理:
(xy)*ab
示例:# grep "(xy)+" grep.txt
Note: 分組括號中的模式匹配到的內容會被正則表示式引擎記錄於內部的變數中,這些變數的命名方式為:\1,\2,\3,…
\1:從左側起,第一個左括號以及與之匹配右括號之間的模式所匹配到的字元;
(ab+(xy)*);
\1
後向引用:引用前面的分組括號中的模式所匹配字元,(而非模式本身)
grep '^[Ss]' /proc/meminfo
-
sort -t: -k3 -n /etc/passwd | tail -1 | cut -d: -f1
-
grep "\b[0-9]{2,3}\b" /etc/passwd # grep "\b[[:digit:]]{2,3}\b" /etc/passwd
-
grep "^[[:space:]]+[^[:space:]]" /etc/grub2.cfg
-
netstat -tan | grep "LISTEN[[:space:]]*$"
-
grep "^([[:alnum:]]+\>).*\1$" /etc/passwd
grep "(^[[:alnum:]]+\>).*\1$" /etc/passwd
grep "^([[:alnum:]]+\>).*\1$" /etc/passwd
egrep = grep -E
擴充套件正則表示式的元字元
字元匹配:跟正則表達一樣
次數匹配:
?: 0或1次
+:1次或多次
{m}: 匹配m次
{m,n}:至少m; 至多n次
錨定:
^
$
\<,\b
\>,\b
分組:
()
後向引用:\1,\2,…
或者:
a|b
grep -E '^(root|centos|user1)\>' /etc/passwd
grep -E '^(root|centos|user1)\>' /etc/passwd | cut -d: -f1,3,7
grep -E -o "^[_[:alpha:]]+()" /etc/rc.d/init.d/functions
echo "/mnt/sdc" | grep -E -o "[^/]+/?$" | cut -d"/" -f1
進一步:使用egrep取出路徑的目錄名,類似於dirname命令結果,
fgrep: 不支援正則表示式搜尋: