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

一、前言

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

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

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

二、基础正则表达式

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

2.1、grep命令

2.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
...省略内容

2.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

2.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

2.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

2.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

2.2、元字符总结

在这里插入图片描述

三、扩展正则表达式

3.1、egrep命令

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

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

在这里插入图片描述

3.3、正则表达式总结

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

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

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

  • grep命令

命令基本格式
grep -cinv 'word' filename
-c '行数'
-i '不区分大小写'
-n '显示行号'
-v '取反'
-r '遍历所有子目录'
发布了69 篇原创文章 · 获赞 32 · 访问量 3450

猜你喜欢

转载自blog.csdn.net/qq_28361541/article/details/103421553