11.1 什么是正则表达式
处理字符串的方法,以行为单位来进行字符串的处理操作,正则表达式通过一些特殊符号的辅助,可以让用户轻易地完成【查找、删除、替换】某特定字符串的处理过程
11.2 基础正则表达式
基础正则(第一类)
# | 元字符 | 意义 | 示例 |
---|---|---|---|
1 | ^word | 以关键字 word 开头的行 | grep '^hello' a.txt 在a.txt 文件中,查找以 hello 开头的行 |
2 | word$ | 以关键字 word 结尾的行 | grep 'hello$' a.txt 在a.txt 文件中,查找以 hello 结尾的行 |
3 | . | 一定有一个任意字符 | grep 'e.e' a.txt 在a.txt 文件中,查找有exe的行,x 代表一个任意字符 |
4 | * | 重复零个或者无穷多个的前导字符 | grep 'ess*' a.txt 在a.txt 文件中,查找带有es的行 |
5 | [list] | 查找包含list集合中任意一个字符 | grep 'es[ab]' a.txt 在a.txt 文件中,查找带有esa 或者 esb 的行 |
6 | [n1-n2] | 列出想要查找的所有字符范围 | grep '[a-z]' a.txt 在a.txt 文件中,查找带有小写字母的行 |
7 | [^list] | 列出不需要的字符范围 | grep '[^a-z]' a.txt 在a.txt 文件中,过滤掉纯小写字母的行 注:如果某行同时包含小写字母以及还有其余的字符,那么该行也会被找出来 |
8 | ^[list] | 查找包含list集合中任意一个字符开头的行 | grep '^[a-z]' a.txt 在a.txt 文件中,查找小写字母开头的行 |
9 | ^[^list] | 查找不以包含list集合中任意一个字符开头的行 | grep '^[^a-z]' a.txt 在a.txt 文件中,查找不是以小写字母开头的行 |
10 | \{n\} | 前导字符连续出现 n 次 | grep 'l\{2\}' a.txt 在a.txt 文件中,查找 l 连续出现两次的行 |
11 | \{n,\} | 前导字符至少连续出现 n 次 | grep 'l\{2,\}' a.txt 在a.txt 文件中,查找 l 至少连续出现两次的行 |
12 | \{n,m\} | 前导字符连续出现 n 到 m 次 | grep 'l\{2,3\}' a.txt 在a.txt 文件中,查找 l 连续出现两次到三次的行 |
13 | \ | 转义字符,将特殊符号的意义去掉 | grep '^\$' a.txt 在a.txt 文件中,查找$开头的行
|
14 | \<word | 查找单词中包含word开头的单词 | grep '\<hel' a.txt 在a.txt 文件中,查找包含 以hel 开头的单词行 |
15 | word\> | 查找以word结尾的单词 | grep 'lo\>' a.txt 在a.txt 文件中,查找包含 以lo 结尾的单词行 |
16 | \<word\> | 只匹配word单词 | grep '\<lo\>' a.txt 在a.txt 文件中,查找 lo 单词行 |
17 | \( \) | 表示分组(括号内的内容)匹配到的部分。 \1 和 \2 是用来引用分组捕获的内容的特殊符号。 | echo 'Hello, World !'| sed 's/\(Hello\), \(World\) !/Goodbye, \2, \1!/' 将Hello, World ! 替换成 Goodbye, World, Hello! |
18 | .* | 任意字符 | grep '.*' a.txt 在a.txt 文件中,查找任意字符 |
19 | ^$ | 空行 | grep '^$' a.txt 在a.txt 文件中,查找空白行 |
20 | \d | 匹配数字,等同[0-9] | grep -P '\d' a.txt 在a.txt 文件中,查找数字 |
21 | \w | 匹配字母数字下划线,等同[0-9a-zA-Z_] | grep -P '\w' a.txt 在a.txt 文件中,查找字符和数字以及下划线 |
22 | \s | 匹配空格、制表符、换页符,等同[\t\r\n] | grep -P '\s' a.txt 在a.txt 文件中,查找空格、制表符、换页符 |
基础正则(第二类)
# | 表达式 | 含义 | 示例 |
---|---|---|---|
1 | [:alnum:] | 字母与数字字符 | [[:alnum:]] |
2 | [:alpha:] | 字母字符(包括大小写) | [[:alpha:]] |
3 | [:blank:] | 空格与制表符 | [[:blank:]] |
4 | [:digit:] | 数字 | [[:digit:]] |
5 | [:lower:] | 小写字母 | [[:lower:]] |
6 | [:upper:] | 大写字母 | [[:upper:]] |
7 | [:punct:] | 标点符号 | [[:punct:]] |
8 | [:space:] | 换行符、回车等在内的所有空白 | [[:space:]] |
扩展正则:
# | 元字符 | 意义 | 示例 |
---|---|---|---|
1 | + | 重复一个或者一个以上的前导字符 | grep -E 'l+' a.txt 在a.txt 文件中,查找字符 l 的行 |
2 | ? | 零个或者一个前导字符 | grep -E 'l?' a.txt 在a.txt 文件中,查找没有字符 l 或者最多两个的行 |
3 | | | 或 | grep -E 'hello|abc' a.txt 在a.txt 文件中,查找hello 或者abc 的行 |
4 | () | () 通常表示一个分组,允许将多个字符作为一个整体进行处理 | grep -E '(abc)+' a.txt 在a.txt 文件中,查找至少有一个abc 的行 |
5 | ()+ | 重复括号内的内容 | grep -E '(abc)+' a.txt 在a.txt 文件中,查找至少有一个abc 的行 |
四、总结:
-
目标:要找什么?
找数字 [0-9]
找字母 [a-zA-Z]
找标点符号 [[:punct:]]
-
方法:如何找?
以什么开头 ^key
以什么结尾 key$
包含什么 [abc]
不包含什么 [^abc]
-
找多少?
找前导字符出现0次或者多次 ab*
找任意单个字符 ab.
找任意字符 ab.*
找前导字符连续出现多次 \{n\} \{n,\} \{n,m\} {n} {n,} {n,m}
找前导字符出现1次或者多次 go+
找前导字符出现0次或者1次 go?
五、巩固练习
# | 题目 | shell写法 | ||
---|---|---|---|---|
1 | 查找不以大写字母开头的行 | 1、grep '^[^A-Z]' a.txt 2、grep -v '^[A-Z]' a.txt 3、 grep '^[^[:upper:]]' a.txt | ||
2 | 查找有数字的行 | 1、grep '[0-9]' a.txt 2、grep -P '\d' a.tx | ||
3 | 查找一个数字和一个字母连起来的行 | 1、grep -E '[0-9][a-zA-Z]|[a-zA-Z][0-9]' a.txt 2、grep -E '[0-9][a-Z]|[a-Z][0-9]' a.txt | ||
4 | 查找不以 r 开头的行 | 1、grep '^[^r]' a.txt 1、grep -v '^r' a.txt | ||
5 | 查找以数字开头的行 | 1、grep '^[0-9]' a.txt 2、grep -P '^\d' a.txt 备注 第一个命令使用基本正则表达式语法,使用 第二个命令使用 Perl 兼容的正则表达式语法,使用 | ||
6 | 查找以大写字母开头的行 | 1、grep '^[A-Z]' a.tx | ||
7 | 查找以小写字母开头的行 | 1、grep '^[a-z]' a.tx | ||
8 | 查找以点结束的行 | 1、grep '\.$' a.tx | ||
9 | 去掉空行 | 1、grep -v '^$' a.txt | ||
10 | 查找完全匹配abc的行 | 1、grep '\<abc\>' a.txt 2、grep -w 'abc' a.txt | ||
11 | 查找A后面有三个数字的行 | 1、grep -E 'A[0-9]{3}' a.txt 2、grep 'A[0-9]\{3\}' a.txt 备注: 1中使用-E是使用扩展正则表达式, 2中为基本正则表达式, | ||
12 | 统计root在/etc/passwd下出现了几次 | 1、grep -o 'root' a.txt | wc -l | ||
13 | 匹配合法的IP地址 | 1、[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\} 2、[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\} 3、[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} 4、[0-9]{1,3}\.){3}[0-9]{1,3} 5、(\d{1,3}\.){3}\d{1,3} 6、(\d+\.){3}\d+ | ||
14 | 查找出IP地址、广播地址、子网掩码 | 1、ifconfig eth0|grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'|sed -r 's/ +//'|cut -d' ' -f2,5,8 注:字符串开头有多个空格,cut 命令将无法正确识别第一个字段。此时,可以使用 sed 命令先将连续的空格替换为单个空格 2、ifconfig eth0|grep -E -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' 3、ifconfig eth0|grep -E -o '([0-9]{1,3}\.){3}[0-9]{1,3}' | ||
15 | 找出全部是数字的行 |
| ||
16 | 找出文件中以235结尾的IP地址并且替换成172.16.53.235 |
| ||
17 | 查找文件中的合法ip,不合法的不打出 |
|