实战 Linux 正则表达式

正则表达式字符

特殊字符 ^$[].*\?+{}|() (在 sed 中使用 ?+{}|() 需要转义符 \)

字符 功能 匹配实例 不匹配实例
^ 行首 echo "book is" | sed -n '/^book/p' echo "a book" | sed -n '/^book/p'
$ 行尾 echo "a book" | sed -n '/book$/p' echo "book is" | sed -n '/book$/p'
^$ 行首和行尾 echo "book" | sed -n '/^b.*k$/p' echo "a book" | sed -n '/^b.*k$/p'
删除空白行 sed '/^$/d' file
[] 字符组 echo "book" | sed -n '/[bc]ook/p' echo "book" | sed -n '/[ac]ook/p'
[^] 排除型字符组 echo "book" | sed -n '/[^ac]ook/p' echo "book" | sed -n '/[^ab]ook/p'
[] 区间 echo "book" | sed -n '/[a-z]ook/p' echo "book" | sed -n '/[A-Z]ook/p'
. 任意单个字符 echo "book" | sed -n '/b..k/p' echo "book" | sed -n '/b.k/p'
* 0次或多次 echo "book" | sed -n '/bo*k/p' echo "book" | sed -n '/ba*k/p'
? 0次或1次 echo "book" | sed -n '/b\?k/p' echo "book" | sed -n '/bo\?k/p'
+ 1次或多次 echo "book" | sed -n '/bo\+k/p' echo "book" | sed -n '/booo\+k/p'
m次 echo "book" | sed -n '/bo\{2\}/p' echo "book" | sed -n '/bo\{3\}/p'
至少m次,至多n次 echo "book" | sed -n '/bo\{1,2\}/p' echo "book" | sed -n '/bo\{3,4\}/p'
| 逻辑OR echo "book" | sed -n '/book\|look/p' echo "book" | sed -n '/cook\|look/p'
() 表达式分组 echo "book" | sed -n '/\(ok\)\+/p' echo "book" | sed -n '/\(ak\)\+/p'

POSIX 基础正则表达式 BRE(Basic Regular Expression) 特殊字符组

字符组 描述
[[:alpha:]] 匹配任意字母字符,不管是大写还是小写
[[:alnum:]] 匹配任意字母数字字符 09,AZ 或 a~z
[[:blank:]] 匹配空格或制表符
[[:digit:]] 匹配 0~9 之间的数字
[[:lower:]] 匹配小写字母字符 a~z
[[:print:]] 匹配任意可打印字符
[[:punct:]] 匹配标点符号
[[:space:]] 匹配任意空白字符:空格,制表符,NL,FF,VT 和 CR
[[:upper:]] 匹配任意大写字母字符 A~Z

查找字符串 grep

如果只是查找是否包含“字符串”,使用 grep 是合适的。

  • ps | grep ppp 查找 ppp 进程
  • ifconfig | grep ppp 查找 ppp 端口

更多 grep 用法请链接快速查找 grep 常用命令

带分隔符 awk

如果字符串有“分隔符”--空格,冒号,逗号等,那么使用 awk 是合适的。

实例1 提取 IP 和 MAC 地址

  • ifconfig enp2s0 | awk '/inet /{print $2}' 锚定词=inet IP 位于第 2 列
  • ifconfig enp2s0 | awk '/ether/{print $2}' 锚定词=ether MAC 位于第 2 列

实例2 基于 MAC 地址生成 EUI

ifconfig enp2s0 | awk '/ether/{print $2}' | awk -F: '{print $1$2$3"fffe"$4$5$6}'
分隔符=: 在 1~6 列中间插入fffe

更多 awk 用法请链接快速查找 awk 常用命令

任意字符串 sed

如果字符串没有明显的分隔符,那么使用 sed 是合适的。

实例 提取 ping 成功率

ping -c 1 -w 1 8.8.8.8 | sed -n 's/.*received, \([0-9]\{1,3\}\)%.*/\1/p'
前锚定词='received, ',后锚定词='%',目标=[0-9]{1,3},因为 sed 使用'()'定义子模式,使用'\1'提取子模式
特别留意:在 sed 中使用 ?+{}|() 需要转义符 \

更多 sed 用法请链接快速查找 sed 常用命令

替换字符串 sed

如果需要从文件中替换字符串,那么使用 sed 是合适的。

实例 修改文件中的 IP 地址

sed -i "s/\(.*\"ipaddr\": \"\)\([0-9.]*\)\(\",\)/\1$IP\3/" ./ip.json
子模式1=' "ipaddr": "' 正则表达式=.*"ipaddr": "
子模式2='192.168.1.99' 正则表达式=[0-9.]*
子模式3='",' 正则表达式=",
因为 sed 使用'()'定义子模式,使用'\1\2\3'提取子模式 1 2 3
特别留意:在 sed 中使用 ?+{}|() 需要转义符 \,另外调用 $IP 变量 sed 需要使用"双引号"而不是“单引号”

posted @ 2022-09-11 08:37  KevinAshton  阅读(113)  评论(0编辑  收藏  举报