Linux 正则表达式

环境准备

复制代码
 [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
相关推荐
奔跑吧 android3 小时前
【linux kernel 常用数据结构和设计模式】【数据结构 2】【通过一个案例属性list、hlist、rbtree、xarray数据结构使用】
linux·数据结构·list·kernel·rbtree·hlist·xarray
yzx9910133 小时前
生活在数字世界:一份人人都能看懂的网络安全生存指南
运维·开发语言·网络·人工智能·自动化
橙*^O^*安5 小时前
Go 语言基础:变量与常量
运维·开发语言·后端·golang·kubernetes
NiKo_W5 小时前
Linux 文件系统与基础指令
linux·开发语言·指令
阿拉斯加大闸蟹6 小时前
基于RDMA 通信的可负载均衡高性能服务架构
运维·架构·负载均衡
Darkwanderor6 小时前
Linux 的权限详解
linux
SabreWulf20207 小时前
Ubuntu 20.04手动安装.NET 8 SDK
linux·ubuntu·avalonia·.net8
不是吧这都有重名7 小时前
为什么ubuntu大文件拷贝会先快后慢?
linux·运维·ubuntu
sunshine-sm7 小时前
CentOS Steam 9安装 Redis
linux·运维·服务器·redis·centos
小熊h7 小时前
MySQL集群高可用架构——组复制 (MGR)
linux·数据库·mysql