环境准备
[lyk@controller ~ 15:21:03]$ mkdir lab
[lyk@controller ~ 15:21:08]$ cd lab
[lyk@controller lab 15:21:11]$ vim words
cat
category
acat
concatenate
dog
普通字符
[lyk@controller lab 15:21:36]$ cat words |grep 'cat'
cat
category
acat
concatenate
字符集[...]
匹配 [...]
中的任意一个字符。
[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'
cat
category
acat
concatenate
cbt
[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'
cat
category
acat
concatenate
cbt
[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'
cat
category
acat
concatenate
cbt
c1t
[lyk@controller lab 15:24:17]$ cat words | grep 'c[a-zA-Z0-9]t'
cat
category
acat
concatenate
cbt
c1t
cCt
# 要想匹配-符号,将改符号写在第一个位置
[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'
cat
category
acat
concatenate
cbt
c1t
cCt
c-t
匹配除了 [...]
中字符的所有字符。
[lyk@controller lab 15:25:07]$ cat words | grep 'c[^ab]t'
c1t
cCt
c-t
# ^放中间会被当做普通字符
[lyk@controller lab 15:25:41]$ cat words | grep 'c[a^b]t'
cat
category
acat
concatenate
cbt
. 匹配除换行符(\n
、\r
)之外的任何单个字符,相等于\[^\n\r]
。
[lyk@controller lab 15:26:03]$ cat words | grep 'c.t'
cat
category
acat
concatenate
cbt
c1t
cCt
c-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'
cat
category
acat
concatenate
|
符号是扩展 表达式中元字符,指明两项之间的一个选择。要匹配 |
,请使用 \|
。
# 使用egrep或者grep -E 匹配
[lyk@controller lab 15:27:23]$ cat words | egrep 'cat|dog'
cat
category
acat
concatenate
dog
#或者
[lyk@controller lab 15:27:57]$ cat words | grep -E 'cat|dog'
cat
category
acat
concatenate
dog
非打印字符
终端中不显示的字符,例如换行符。
字符 | 描述 |
---|---|
\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