Shell 编程 —— 正则表达式与文本处理器


Shell 编程 —— 正则表达式与文本处理器

1. 正则表达式

1.1 定义

  • 正则表达式(Regular Expression, regex/regexp/RE)是一种用来描述字符串模式的规则。
  • 功能:检索、替换、过滤符合特定规则的字符串。

1.2 用途

  • 系统日志筛选(如定位“登录失败”“服务启动失败”)
  • 配置文件解析
  • 文本查找替换
  • 脚本编程中的条件匹配

1.3 Linux 正则表达式分类

  1. BRE (基础正则表达式)
    • 传统语法,功能有限
    • 量词 {} 需要转义 \{n,m\}
    • +, ?, () 需要转义
    • 常用工具:grepsed
  2. ERE (扩展正则表达式)
    • 功能更强大,语法简洁
    • +, ?, (), {}, | 等无需转义
    • 常用工具:egrep (grep -E)、awk

1.4 正则表达式组成

1.4.1 普通字符
  • 字母、数字、标点符号等本身。
1.4.2 元字符
  • . 匹配任意单个字符

  • 匹配任意单个字符(除 \r\n),就是“通配符”,你想匹配啥都行一个字符

  • [] 匹配字符集 [a-z] [0-9] [A-Z]

    匹配list列表中的一个字符 例: go[ola]d,[abc]、[a-z]、[a-z0-9]

  • [^list] 匹配非集合中的字符

    匹配任意不在list列表中的一个字符 例: [a-z]、[0-9]、[^A-Z0-9]

  • ^ 行首

  • $ 行尾

  • \ 转义符

    特殊字符进行转义,忽略其特殊意义a\.b匹配a.b,但不能匹配ajb,.被转义为特殊意义
    
1.4.3 重复次数
  • * 0 次或多次

    匹配前面子表达式0次或者多次 例:goo*d、go.*d
    
  • \+ 至少 1 次

    匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
    
  • \{n\} 恰好 n 次

    匹配前面的子表达式n次,例:go\{2\}d、'[O-9]\{2\}'匹配两位数字
    
  • \{m,n\} m 到 n 次

    匹配前面的子表达式n到m次,例: go\{2,3\)d、'[0-9]\{2,3\}'匹配两位到三位数字
    
  • \{n,\} 至少 n 次

    匹配前面的子表达式不少于n次,例: go\{2,\}d、' [0-9]\{2,\}'匹配两位及两位以上数字
    

注:

扩展

egrep、awk使用{n}、{n, }、{n, m}匹配时“{}"前不用加"\”
egrep -E -n 'wo{2}d' test.txt   //-E 用于显示文件中符合条件的字符
egrep -E -n 'wo{2,3}d' test.txt

案列:
+	作用:重复一个或者一个以上的前一个字符
示例:执行“egrep -n 'wo+d' test.txt”命令,即可查询"wood" "woood" "woooooood"等字符串

?	作用:零个或者一个的前一个字符
示例:执行“egrep -n 'bes?t' test.txt”命令,即可查询“bet”“best”这两个字符串

|	作用:使用或者(or)的方式找出多个字符
示例:执行“egrep -n 'of|is|on' test.txt”命令即可查询"of"或者"if"或者"on"字符串

()	作用:查找“组”字符串
示例:“egrep -n 't(a|e)st' test.txt”。“tast”与“test”因为这两个单词的“t”与“st”是重复的,所以将“a”与“e”
列于“()”符号当中,并以“|”分隔,即可查询"tast"或者"test"字符串

()+	作用:辨别多个重复的组
示例:“egrep -n 'A(xyz)+C' test.txt”。该命令是查询开头的"A"结尾是"C",中间有一个以上的"xyz"字符串的意思

2. grep —— 条件查找

常用选项

  • -E:启用扩展正则
  • -c:统计匹配行数
  • -i:忽略大小写
  • -o:只输出匹配内容
  • -v:反向匹配(不包含的行)
  • -n:显示行号
  • --color=auto:高亮匹配

示例

grep -c root /etc/passwd       # 统计 root 出现的行数
grep -i "the" web.sh           # 不区分大小写匹配
grep -v root /etc/passwd       # 输出不包含 root 的行
grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+' ifconfig.out | head -1 # 提取 IP 地址

3. 基础正则 vs 扩展正则

BRE 常见元字符

  • ^ 行首
  • $ 行尾
  • . 任意单字符
  • [list] 匹配字符集
  • [^list] 反向匹配
  • * 0 或多次
  • \{n\} 精确次数
  • \{n,\} 至少 n 次
  • \{n,m\} n~m 次

ERE 新增功能

  • + 一个或多个
  • ? 0 或 1 次
  • | 或者(OR)
  • () 分组
  • ()+ 匹配重复的组

4. 元字符操作案例

  1. 查找特定字符
grep -n 'the' test.txt       # 查找 the
grep -vn 'the' test.txt      # 反向匹配

在这里插入图片描述

  1. 中括号集合
grep -n 'sh[io]rt' test.txt  # shirt 或 short
grep -n '[^w]oo' test.txt    # 前面不是 w 的 oo

在这里插入图片描述

  1. 定位符
grep -n '^the' test.txt      # 行首是 the
grep -n '\.$' test.txt       # 行尾是 .
grep -n '^$' test.txt        # 空行

在这里插入图片描述

  1. 点与星
grep -n 'w..d' test.txt      # w 开头 d 结尾,中间两个字符
grep -n 'woo*d' test.txt     # w 开头 d 结尾,中间 o 可有可无
grep -n 'w.*d' test.txt      # w 开头 d 结尾,中间任意字符
执行以下命令即可查询任意数字所在行。
grep -n '[0-9][0-9]*' test.txt

在这里插入图片描述

  1. 次数限定符
#查询两个 o 的字符。
grep -n 'o\{2\}' test.txt        # oo
#查询以 w 开头以 d 结尾,中间包含 2~5 个 o 的字符串
grep -n 'wo\{2,5\}d' test.txt    # w 开头 d 结尾,2-5 个 o

#查询以 w 开头以 d 结尾,中间包含 2 个或 2 个以上 o 的字符串。
grep -n 'wo\{2,\}d' test.txt     # 至少两个 o

在这里插入图片描述

5.总结

正则表达式是一种用来描述字符串模式的规则。功能:检索、替换、过滤符合特定规则的字符串。

元字符
通过上面几个简单的示例,可以了解到常见的基础正则表达式的元字符主要包括以下几个

  • ^ 匹配输入字符串的开始位置。除非在方括号表达式中使用,表示不包含该字符集合。要匹配“^” 字符本身,请使用“^”

  • $ 匹配输入字符串的结尾位置。如果设置了RegExp 对象的 Multiline 属性,则“KaTeX parse error: Undefined control sequence: \n at position 6: ”也匹配‘\̲n̲’或‘\r’。要匹配“”字符本身,请使用“$”

  • . 匹配除“\r\n”之外的任何单个字符

  • \ 反斜杠,又叫转义字符,去除其后紧跟的元字符或通配符的特殊意义

  • “*” 匹配前面的子表达式零次或多次。要匹配“*”字符,请使用“*”

  • [] 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”

  • [^] 赋值字符集合。匹配未包含的一个任意字符。例如,“[^abc]”可以匹配“plin”中任何一个字母

  • [n1-n2] 字符范围。匹配指定范围内的任意一个字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意一个小写字母字符。
    注意:只有连字符(-)在字符组内部,并且出现在两个字符之间时,才能表示字符的范围;如果出现在字符组的开头,则只能表示连字符本身

  • {n} n 是一个非负整数,匹配确定的 n 次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的“oo”

  • {n,} n 是一个非负整数,至少匹配 n 次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”

  • {n,m} m 和 n 均为非负整数,其中 n<=m,最少匹配 n 次且最多匹配m 次

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值