shell脚本之正则表达式(grep 和 egrep命令详解)

前言

  • 正则表达式,是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串。

  • 正则表达式是由普通字符与元字符组成的文字模式。

  • 正则表达式一般用于脚本编程与文本编辑器中。

一、基础正则表达式

  • 根据不同的严谨程度与功能:分为基本正则表达式与扩展正则表达式。
  • 基础正则表达式是常用的正则表达式的最基础的部分。
  • 在 Linux 系统中常见的文件处理工具中 grep 与 sed 支持基础正则表达式
  • egrep 与 awk 支持扩展正则表达式。

1.1、grep命令

1.1.1、查找特定字符

-n : 表示显示行号
-i : 表示不区分大小写
-v : 表示反方向查找
grep -n 'the' abc.txt  //查找有the的行,并显示出行号
grep -in ‘the’ abc.txt  //不区分大小写查找有the的行,并显示行号

如果是想查找不包含the的行,-vn选项即可:

[root@client ~]# grep -vn 'the' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
...省略内容

1.1.2、中括号 [ ] 集合字符

  • 当我们需要查找两个字符 “shirt” 和 “short” 这两个字符时,其中 i 和 o 都是相同的.
  • 可以用 [ ]来匹配字符,[ ] 中不论有几个字符,都仅代表一个字符
[root@localhost ~]# grep -n 'sh[io]rt' /etc/passwd
  • 查找包含重复单个字符“oo”
[root@localhost ~]# grep -n 'oo' /etc/passwd
  • 集合字符的反向选择可以通过“[^]”实现

  • 在 /etc/passwd文本中查找“oo” 前面不是“w”的字符串

[root@localhost ~]# grep -n '[^w]oo' /etc/passwd
  • 检索“oo”前面不存在大小写字母的字符串
[root@localhost ~]# grep -n '[^a-zA-Z]oo' /etc/passwd
  • 查找包含数字的行
[root@localhost ~]# grep -n '[0-9]' /etc/passwd

1.1.3、行首符“^”与行尾字符“$

  • 查找以the这个字符串开头的行
[root@localhost ~]# grep -n '^the' abc. txt
  • 查找以小写字母开头的行
[root@localhost ~]# grep -n '^[a-z]' abc.txt  
  • 查找以大写字母开头的行
[root@localhost ~]# grep -n [A-Z]' abc.txt 
  • 查找以不是字母开头的行
[root@localhost ~]# grep -n '^[^a-zA-Z]' abc.txt
  • 查询以点(.)结尾的行
[root@localhost ~]# grep -n '\.$' /etc/passwd
    // 这里的.不作为元字符使用,可加上转义符 \
  • 查看空白行的行号
[root@localhost ~]# grep -n '^$' /etc/passwd

1.1.4、任意一个字符“.”与重复字符“*”

  • 在正则表达式中小数点(.)也是一个元字符,代表任意一个字符
  • *代表的是重复零个或多个前面的单字符
  • 查找以 w 开头 d 结尾,共有四个字符的字符串
[root@localhost ~]# grep -n 'w..d' /etc/passwd
  • 要查询 wood、woood、woooood 等资料,则需要使用星号(*)元字符
[root@localhost ~]# grep –n 'o*' /etc/passwd 'o的数量是0到多个'
  • 查询包含至少两个 o 以上的字符串
[root@localhost ~]# grep –n'ooo*' /etc/passwd  'o的数量是2到多个'
  • 查询以 w 开头 d 结尾,中间的字符可有可无的字符串
[root@localhost ~]# grep –n'w.*d' /etc/passwd
  • 查询任意数字所在行
[root@localhost ~]# grep –n'[0-9][0-9]*' /etc/passwd

1.1.5、连续字符范围“{}”

  • 因为“{}”在 Shell 中具有特殊 意义,所以在使用“{}”字符时,需要利用转义字符“\”,将“{}”字符转换成普通字符
  • 查询两个 o 的字符
[root@localhost ~]# grep -n 'o\{2\}' /etc/passwd '2表示两个o'
  • 查询以 w 开头以 d 结尾,中间包含 2~5 个 o 的字符串
[root@localhost ~]# grep -n 'wo\{2,5\}d' /etc/passwd
  • 查询以 w 开头以 d 结尾,中间包含 2 以上 o 的字符串
[root@localhost ~]# grep -n 'wo\{2,\}d' /etc/passwd

1.2、元字符总结

元字符作用
^匹配输入字符串的开始位置。除非在方括号表达式中使用,表示不包含该字符集合。要匹配" ^" 字符本身,请使用 “^”
$匹配输入字符串的结尾位置。如果设置了RegExp对象的Multiline属性,则KaTeX parse error:Undefined control sequence: \n at position 6:”也匹配‘\n’或‘\r’。要匹配"“字符本身,请使用”$"
.匹配除\r\n"之外的任何单个字符
\将下一个字符标记为特殊字符、原义字符、向后引用、八进制转义符。例如,'n’匹配字符"n"。"\n’匹配换行符。序列"\“匹配”",而(则匹配"(”
*匹配前面的子表达式零次或多次。要匹配"*”字符,请使用"*"
[]字符集合。匹配所包含的任意一个字符。例如,“[abc]“可以匹配”“plain"中的"a”
[^]赋值字符集合。匹配未包含的一个任意字符。例如,“[ ^abc ]“可以匹配"plain"中”“plin"中的任何一个字母
[n1-n2]字符范围。匹配指定范围内的任意一个字符。例如,[a-z][可以匹配"a"到"z"范围内的任意一个小写字母字符。注意:只有连字符(-)在字符组内部,并且出现在两个字符之间时,才能表示字符的范围;如果出现在字符组的开头,则只能表示连字符本身
{n}n是一个非负整数,匹配确定的n次。例如,“o\ {2}"不能匹配"Bob"中的"o”,但是能匹配"food"中的两个o
{n,}是一个非负整数,至少匹配n次。例如,“o{2,}"不能匹配"Bob"中的"o”,但能匹配"fooood"中的所有o。“o{1,}等价于"o+”。"o{0,}“则等价于"o*”
{n,m}m和n均为非负整数,其中n<=m,最少匹配n次且最多匹配m次

二、扩展正则表达式

2.1、egrep命令

  • 使用基础正则表达式查询除文件中空白行与行首为“#” 之外的行(通常用于查看生效的配置文件)
执行
grep –v '^$' test.txt | grep –v '^#'
  • 使用扩展正则表达式
egrep –v '^$|^#' test.txt		'单引号内的管道符号表示或者(or)'

2.2、扩展正则表达式常见元字符

元字符作用与示例
+作用:重复一个或者一个以上的前一个字符示例:执行"egrep -n ‘wo+d’’ test.txt"命令,即可查询"wood""woood”"woooooood"等字符串
?作用:零个或者一个的前一个字符示例:执行"egrep -n ‘‘bes?t’ test.txt"命令,即可查询“bet""best"这两个字符串
l作用:使用或者(or)的方式找出多个字符示例:执行"egrep -n ‘of l is l on’ test.txt"命令即可查询"of"或者"is"或者"on"字符串
()作用:查找"组"“字符串示例:“egrep -n ‘t(ale)st’ test.txt”。"tast"与"test"因为这两个单词的"t"与“st"是重复的,所以将“a"与“e”列于“()"符号当中,并以"分隔,即可查询"tast"或者"test"字符串
()+作用:辨别多个重复的组示例: “egrep -n ‘A(xyz)+C’ test.txt"。该命令是查询开头的"A"结尾是"C",中间有一个以上的“xyz"字符串的意思

2.3、正则表达式总结

  • grep命令都可以使用egrep实现

  • grep ‘o\ {2\ }’ /etc/passwd # 特殊符号需要用脱意符号\,不然无法识别

  • egrep ‘o{2}’ /etc/passwd # 用egrep命令,不需要脱意,{}表示前边字符的重复范围

  • grep命令

命令基本格式
grep -cinv 'word' filename
-c '行数'
-i '不区分大小写'
-n '显示行号'
-v '取反'
-r '遍历所有子目录'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值