Linux 正则表达式
环境准备
[lyk@controller ~ 15:21:03]$ mkdir lab[lyk@controller ~ 15:21:08]$ cd lab[lyk@controller lab 15:21:11]$ vim wordscatcategoryacatconcatenatedog
普通字符
[lyk@controller lab 15:21:36]$ cat words |grep 'cat'catcategoryacatconcatenate
字符集[...]
匹配 [...]
中的任意一个字符。
[lyk@controller lab 15:22:07]$ echo cbt >> words [lyk@controller lab 15:22:57]$ echo c1t >> words[lyk@controller lab 15:23:02]$ cat words | grep 'c[ab]t'catcategoryacatconcatenatecbt
[a-z] [A-Z] [0-9]
[a-z]
,匹配所有小写字母。[A-Z]
,匹配所有大写字母。[0-9]
,匹配所有数字。
[lyk@controller lab 15:23:11]$ cat words | grep 'c[a-z]t'catcategoryacatconcatenatecbt[lyk@controller lab 15:23:38]$ echo cCt >> words [lyk@controller lab 15:23:52]$ cat words | grep 'c[A-Z]t'cCt[lyk@controller lab 15:23:58]$ cat words | grep 'c[0-9]t'c1t[lyk@controller lab 15:24:12]$ cat words | grep 'c[a-z0-9]t'catcategoryacatconcatenatecbtc1t[lyk@controller lab 15:24:17]$ cat words | grep 'c[a-zA-Z0-9]t'catcategoryacatconcatenatecbtc1tcCt# 要想匹配-符号,将改符号写在第一个位置[lyk@controller lab 15:24:27]$ echo c-t >> words [lyk@controller lab 15:25:02]$ cat words | grep 'c[-a-zA-Z0-9]t'catcategoryacatconcatenatecbtc1tcCtc-t
匹配除了 [...]
中字符的所有字符。
[lyk@controller lab 15:25:07]$ cat words | grep 'c[^ab]t'c1tcCtc-t# ^放中间会被当做普通字符[lyk@controller lab 15:25:41]$ cat words | grep 'c[a^b]t'catcategoryacatconcatenatecbt
. 匹配除换行符(\n
、\r
)之外的任何单个字符,相等于\[^\n\r]
。
[lyk@controller lab 15:26:03]$ cat words | grep 'c.t'catcategoryacatconcatenatecbtc1tcCtc-t
\将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。
[lyk@controller lab 15:26:35]$ echo c.t >> words [lyk@controller lab 15:27:05]$ cat words | grep 'c\.t'c.t# 匹配普通字符,虽然可以匹配,但强烈建议不要在前面加\[lyk@controller lab 15:27:09]$ cat words | grep 'c\at'catcategoryacatconcatenate
|
符号是扩展表达式中元字符,指明两项之间的一个选择。要匹配 |
,请使用 \|
。
# 使用egrep或者grep -E 匹配[lyk@controller lab 15:27:23]$ cat words | egrep 'cat|dog'catcategoryacatconcatenatedog#或者[lyk@controller lab 15:27:57]$ cat words | grep -E 'cat|dog'catcategoryacatconcatenatedog
非打印字符
终端中不显示的字符,例如换行符。
字符 | 描述 |
---|---|
\cx | 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。 |
\f | 匹配一个换页符。等价于 \x0c 和 \cL 。 |
\n | 匹配一个换行符。等价于 \x0a 和 \cJ 。 |
\r | 匹配一个回车符。等价于 \x0d 和 \cM 。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v] 。注意 Unicode 正则表达式会匹配全角空格符。 |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v] 。 |
\w | 匹配字母、数字、下划线。等价于 [A-Za-z0-9_] |
\W | 匹配任何非单词字符。等价于[^A-Za-z0-9_] |
\t | 匹配一个制表符。等价于 \x09 和 \cI 。 |
\v | 匹配一个垂直制表符。等价于 \x0b 和 \cK 。 |
grep 命令支持
\w
、\W
、\s
、\S
。
定位符^ 匹配行首位置
[lyk@controller lab 15:28:07]$ cat words | grep '^cat' cat category
$匹配行末位置
[lyk@controller lab 15:29:33]$ cat words | grep 'cat$' cat acat [lyk@controller lab 15:29:58]$ cat words | grep '^cat$' cat#查看/etc/profile文件中有效行 [lyk@controller lab 15:35:10]$ cat /etc/profile | egrep -v '^#|^$'#-v取反,不显示匹配内容#查看 /etc/ansible/ansible.cfg有哪些section [lyk@controller lab 15:41:34]$ cat /etc/ansible/ansible.cfg | egrep '^\[' [defaults] [inventory] [privilege_escalation] [paramiko_connection] [ssh_connection] [persistent_connection] [accelerate] [selinux] [colors] [diff]#查看/var/log/message Aug 19 14:01 到 Aug 19 14:09 日志
\b 匹配一个单词边界
[lyk@controller lab 15:30:02]$ echo hello cat >> words [lyk@controller lab 15:30:26]$ cat words | grep '\bcat' cat category hello cat [lyk@controller lab 15:30:31]$ cat words | grep 'cat\b' cat acat hello cat [lyk@controller lab 15:30:37]$ cat words | grep '\bcat\b' cat hello cat
\B 非单词边界匹配
[lyk@controller lab 15:30:41]$ cat words | grep '\Bcat' acat concatenate
\< 和 \>
\<
,匹配一个单词左边界\>
,匹配一个单词右边界
[lyk@controller lab 15:31:05]$ cat words | grep '\<cat' cat category hello cat [lyk@controller lab 15:31:27]$ cat words | grep 'cat\>' cat acat hello cat
限定次数*
匹配前面的子表达式任意次数
[lyk@controller lab 15:31:32]$ echo dg >> words [lyk@controller lab 15:32:02]$ echo doog >> words [lyk@controller lab 15:32:06]$ cat words | grep 'do*g' dog dg doog
+
是扩展表达式元字符,匹配前面的子表达式一次以上次数
[lyk@controller lab 15:32:10]$ cat words | egrep 'do+g' dog doog
?
是扩展表达式元字符,匹配前面的子表达式一次以下次数
[lyk@controller lab 15:32:38]$ cat words | egrep 'do?g' dog dg
{}
是扩展表达式元字符,用于匹配特定次数。例如:{n}
,配置n次
[lyk@controller lab 15:33:03]$ cat words | egrep 'do{2}g' doog
{m,n}
,是扩展表达式元字符,用于匹配次数介于m-n之间
[lyk@controller lab 15:33:24]$ echo dooog >> words [lyk@controller lab 15:33:41]$ echo doooog >> words [lyk@controller lab 15:33:45]$ cat words | egrep 'do{2,3}g' doog dooog
{m,}
,是扩展表达式元字符,匹配前面的子表达式m次以上次数
[lyk@controller lab 15:33:49]$ cat words | egrep 'do{2,}g' doog dooog doooog
{,n}
,是扩展表达式元字符,匹配前面的子表达式n次以下次数
[lyk@controller lab 15:34:11]$ cat words | egrep 'do{,3}g' dog dg doog dooog
() 标记一个子表达式
[lyk@controller lab 15:34:33]$ echo dogdog >> words [lyk@controller lab 15:34:52]$ echo dogdogdog >> words [lyk@controller lab 15:34:56]$ echo dogdogdogdog >> words [lyk@controller lab 15:35:00]$ cat words | egrep '(dog){2,3}' dogdog dogdogdog dogdogdogdog [lyk@controller lab 15:35:05]$ cat words | egrep '(dog){2,}' dogdog dogdogdog dogdogdogdog