目录
前言
-
正则表达式,是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串。
-
正则表达式是由普通字符与元字符组成的文字模式。
-
正则表达式一般用于脚本编程与文本编辑器中。
一、基础正则表达式
- 根据不同的严谨程度与功能:分为基本正则表达式与扩展正则表达式。
- 基础正则表达式是常用的正则表达式的最基础的部分。
- 在 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 '遍历所有子目录'