{"msg":"操作成功","code":200,"data":{"createBy":"admin","createTime":"2021-02-22 15:43:46","updateBy":"admin","updateTime":"2025-06-16 20:20:07","remark":null,"id":51,"articleTitle":"Shell（十）正则表达式","articleUrl":"shell_regexp","articleThumbnail":"https://www.asumimoe.com/imgfiles/20220908/7769fde9ec5445068e41583cb1c71894.jpg","articleFlag":"0","draftStatus":"1","reprintStatement":"1","articleSummary":"正则表达式使用单个字符来描述、匹配一系列符合某个语法的字符串。在很多文本编辑器里，正则表达式通常被用来检索、替换那些符合某个模式的文本。在Linux中，grep、sed、awk等文本处理工具都支持用过正则表达式进行模式匹配。","articleContent":"正则表达式使用单个字符来描述、匹配一系列符合某个语法的字符串。在很多文本编辑器里，正则表达式通常被用来检索、替换那些符合某个模式的文本。在Linux中，grep、sed、awk等文本处理工具都支持用过正则表达式进行模式匹配。\n\n## 基础正则\n\n```bash\n. 表示匹配单个字符且该字符必须存在\n^ 表示匹配以后边所跟字符开头的行\n$ 表示匹配以前面字符结尾的行\n* 不单独使用，和上一个字符连用，表示前一个字符出现任意次（零次或多次）\n[] 表示匹配括号内的一个字符\n[^] 表示匹配不满足括号内条件的行\n\\< 锚定单词首部 \\> 锚定单词尾部\n\\{m,n\\} 表示匹配前面的字符至少出现m次，至多出现n次\n\\( \\) 表示对字符串进行分组，\\1表示对第一个分组进行调用\n```\n\n### . 表示匹配单个字符且该字符必须存在\n\n```bash\n[root@l1 ~]# cat /etc/passwd | grep  \"r..t\" # 表示匹配r与t之间包含两个字符的行\n1:root:x:0:0:root:/root:/bin/bash\n10:operator:x:11:0:operator:/root:/sbin/nologin\n12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin\n```\n\n### ^ 表示匹配以后边所跟字符开头的行\n\n```bash\n[root@l1 ~]# cat /etc/passwd | grep -n  \"^root\"\n1:root:x:0:0:root:/root:/bin/bash\n```\n\n### $ 表示匹配以前面字符结尾的行\n\n```bash\n[root@l1 ~]# cat /etc/passwd | grep -n  \"bash$\"\n1:root:x:0:0:root:/root:/bin/bash\n45:elastic:x:1000:1000::/home/elastic:/bin/bash\n```\n\n### * 不单独使用，和上一个字符连用，表示前一个字符出现任意次（零次或多次）\n\n```bash\n[root@l1 ~]# cat /etc/passwd | grep -n  \"ro*t\"\n1:root:x:0:0:root:/root:/bin/bash\n10:operator:x:11:0:operator:/root:/sbin/nologin\n19:abrt:x:173:173::/etc/abrt:/sbin/nologin # abrt也在其中，o出现零次的情况同样计数\n28:rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin\n```\n\n### [  ]  表示匹配括号内的一个字符\n\n```bash\n[root@l1 ~]# cat /etc/passwd | grep -n  [ac] # 匹配包含a与包含c的行而不是只匹配包含ac的行\n1:root:x:0:0:root:/root:/bin/bash\n3:daemon:x:2:2:daemon:/sbin:/sbin/nologin\n4:adm:x:3:4:adm:/var/adm:/sbin/nologin\n5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin\n6:sync:x:5:0:sync:/sbin:/bin/sync\n```\n\n### [^ ] 表示匹配不包含括号内字符的行\n\n```bash\n[root@l1 ~]# cat /etc/passwd | grep -n -o  [^a] # 加上-o选项后可以看到不为a的字符均在匹配之列\n1:r\n1:o\n1:o\n1:t\n1::\n```\n\n### \\\\< 锚定单词首部， \\\\> 锚定单词尾部\n\n```bash\n[root@l1 ~]# cat /etc/passwd | grep -n \"\\<bi\"\n1:root:x:0:0:root:/root:/bin/bash\n2:bin:x:1:1:bin:/bin:/sbin/nologin\n6:sync:x:5:0:sync:/sbin:/bin/sync\n```\n\n结果中bin词在匹配之列，而sbin词并没有出现在结果中。\n\n### \\\\{m,n\\\\} 表示匹配前面的字符至少出现m次，至多出现n次\n\n```bash\n[root@l1 ~]# cat /etc/passwd | grep -n \"o\\{2,3\\}\" # 即2表示包含oo和ooo的单词\n1:root:x:0:0:root:/root:/bin/bash\n5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin\n9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin\n```\n\n### \\\\(   \\\\) 可以将正则表达式的一部分括起来组成一个单元，可以对整个单元使用数量限定符\n\n```bash\n如([0-9]{1,3}\\.){3}[0-9]{1,3}表示匹配IP地址\n```\n\n## 扩展正则\n\n`grep`命令时不支持扩展正则的，需要用`egrep`命令或者`grep -E`命令\n\n```bash\n<> 含义与基础正则中相同\n{} 含义与基础正则中相同\n() 含义与基础正则中相同\n```\n\n### + 表示前面的字符出现至少一次的情况\n\n```bash\n[root@l1 ~]# cat /etc/passwd | egrep -n \"r+t\"\n19:abrt:x:173:173::/etc/abrt:/sbin/nologin\n28:rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin\n\n[root@l1 ~]# cat /etc/passwd | egrep -n \".+t\"\n1:root:x:0:0:root:/root:/bin/bash\n7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown\n8:halt:x:7:0:halt:/sbin:/sbin/halt\n10:operator:x:11:0:operator:/root:/sbin/nologin\n```\n\n### |  或\n\n```bash\ncat nginx.conf | egrep -v '(^#|^$)' # 表示去掉nginx.conf配置文件中的注释行和空行后输出\n```\n\n### ? 表示前面的字符出现最多一次的情况\n\n```bash\n[root@l1 ~]# cat /etc/passwd | egrep -n -o \"o?t\"\n1:ot\n1:ot\n1:ot\n7:t\n7:t\n```\n\n### 支持的特殊字符\n\n```bash\n\\w：匹配数字和字母和下划线，等效[a-zA-Z0-9_]\n\\W：与\\w相反，等效[^a-zA-Z0-9_]\n\\d：匹配数字字符，等效[0-9]\n\\D：匹配非数字字符，等效[^0-9]\n\\b：匹配字符串开始或结束，如\\bro匹配root，但不匹配brother\n\\B：匹配非字符串开始或结束，如\\Bro匹配brother，但不匹配root\n\\s：匹配任意的空白字符，表格、换行等\n\\S：匹配非空白字符\n\\n：换行符\n\\r：回车符\n\\t：水平制表符\n\\v：垂直制表符\n\\0：空值符\n```\n\n","categoryId":5,"viewCount":737,"categoryName":"Shell","author":"球接子","authorAvatar":null,"tagIds":[4,10],"tagNames":["Shell","Linux基础"]}}