Linux 中最常见的文本处理工具是:grep、sed、awk,也就是常说的“文本三剑客”
- grep:查找、过滤符合条件的行
- sed:按行编辑、替换、删除、插入文本
- awk:按列处理、条件判断、统计计算
正则表达式就是给这些工具提供匹配规则的语言,它不是普通命令本身,而是一套用于描述文本模式的规则
正则表达式和 Shell 通配符:两者会使用相同的符号,这些符号也有相近的意思,但二者完全不相同,需要注意区分
Linux 中常见的正则表达式主要分为两类:
- BRE:Basic Regular Expression,基础正则表达式
- ERE:Extended Regular Expression,扩展正则表达式
grep sed awk 默认都支持基础正则表达式,但是使用扩展正则表达式就需要使用参数
基础正则常见符号
1. ^:匹配行首
^ 表示一行的开头
grep '^root' /etc/passwd 查找以 root 开头的行
2. $:匹配行尾
$ 表示一行的结尾
grep 'bash$' /etc/passwd 查找以 bash 结尾的行
3. ^$:匹配空行
^ 是行首,$ 是行尾,如果中间什么都没有就表示空行
^$
4. .:匹配任意单个字符
. 表示任意一个字符,但必须有一个字符
grep 'r..t' file.txt 查找 r t 之间存在两个字符的行
grep '.' file.txt 查找任意非空行
5. \:转义字符
有些字符在正则里有特殊含义,比如上述4个字符,如果想匹配它们本身,就需要使用反斜杠转义
grep '\.$' file.txt 匹配以点号结尾的行
6. *:前一个字符重复 0 次或多次
* 在通配符中表示任意内容,而在正则表达式中表示让前一个字符重复 0 次或多次
grep 'go*d' file.txt
可以匹配 gd god good 等
7. .*:任意长度内容
这是最常用的组合之一
grep '^.*n' linux.txt 表示从行首开始,匹配到最后一个 n 为止
注意:默认情况下,正则里的 * 通常是贪婪的,会尽可能多地匹配
8. []:字符集合
[] 表示匹配集合中的任意一个字符
grep '[abc]' file.txt 匹配 a、b、c 中任意一个
grep '[135acbyp]' file.txt 字符数字混合
grep '[a-c]' file.txt 范围写法
grep '[0-9]' file.txt 数字范围
grep '[0-9a-zA-Z]' file.txt 多个范围
9. [^]:字符集合取反
[^] 表示匹配不在集合中的任意一个字符
grep '[^0-9]' file.txt 匹配包含有非数字的行
扩展正则常见符号
要使用扩展正则, grep 和 sed 需要使用 -E 参数,而 awk 可以直接使用
1. +:前一个字符出现 1 次或多次
grep -E 'go+d' file.txt
可以匹配 god good goood 等
2. ?:前一个字符出现 0 次或 1 次
grep -E 'go?d' file.txt
可以匹配 gd god 仅此两个
3. |:或者
grep -E 'linux|weibo' passwd 匹配包含 linux 或 weibo 的行
grep 'linux|weibo' passwd 如果不加 -E 就会查找 linux|weibo 而没有或者的含义
4. {n,m}:控制重复次数
{} 用于指定前一个字符或分组重复的次数
grep -E '[0-9]{3}' file.txt 匹配连续 3 个数字
grep -E '[0-9]{2,4}' file.txt 匹配 2 到 4 个数字
grep -E '[0-9]{2,}' file.txt 匹配至少 2 个数字
grep -E '[0-9]{,4}' file.txt 匹配至多 4 个数字
5. ():分组
() 可以把多个字符或表达式看成一个整体
grep -E 'g(oo|ww)d' file.txt
可以匹配 good 和 gwwd
6. \1、\2:反向引用
反向引用表示引用前面分组匹配到的内容,\1 表示第一个,\2 表示第二个,以此类推
grep -E '([a-z]+)\1' file
匹配至少一个的小写字母字符串并且这个字符串需要重复出现一次
Comments NOTHING