1. shell编程之正则表达式与通配符
正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配。grep、awk、sed等命令可以支持正则表达式。
通配符用来匹配符合条件的文件名,通配符是完全匹配。ls、find、cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配。
1.1 通配符
| 通配符 | 含义 |
|---|---|
| * | 匹配任意内容 |
| ? | 匹配任意一个内容 |
| [] | 匹配中括号中的一个字符 |
# 创建2个文件 wangls 和 wanyls
$ touch wangls
$ touch wanyls
# 创建文件夹
$ mkdir testshell
# 将创建的2个文件移动到文件夹中
$ mv wan?ls ./testshell # ? 代表任意一个内容
$ cd testshell
$ ls wan?ls # ? 代表任意一个内容
wangls wanyls
$ ls wan??? # ? 代表任意一个内容 三个?代表3个字符
wangls wanyls
$ ls wan* # * 代表任意内容
wangls wanyls
$ ls wan[gy]ls # 匹配[]中出现的一个字符,此处匹配 g 或者 y字符,两个符合任选一
wangls wanyls
1.2 正则表达式
正则表达式和通配符是有差距的, 通配符是用来匹配文件名的,正则表达式是用来匹配文件的
正则表达式是包含匹配,通配符是完全匹配,通配符有 * ? []
# grep 正则表达式是包含匹配,是匹配文件内容的
$ grep "http-client" config.log
2020-12-16 13:28:22.031 INFO [main :c.a.n.c.u.ParamUtil] [settings] [http-client] connect timeout:1000
2020-12-16 14:00:45.649 INFO [main :c.a.n.c.u.ParamUtil] [settings] [http-client] connect timeout:1000
1.3 基础正则表达式
| 元字符 | 作用 |
|---|---|
| * | 前一个字符匹配0次或任意多次 |
| . | 匹配除了换行符外任意一个字符 |
| ^ | 匹配首行。例如:^hello会匹配以hello开头的行 |
| $ | 匹配行尾。例如:hello$会匹配以hello结尾的行 |
| [] | 匹配中括号中指定的任意一个字符,之匹配一个字符,[0-9]匹配任意一位数字,[a-z][0-9]匹配小写字母和一位数字构成的两位字符 |
| [^] | 匹配除中括号的字符以外的任意一个字符。例如[^0-9]匹配任意一位非数字字符 |
| \ | 转义字符,用于取消元字符的具体含义 |
| \ | 表示其 前面的字符恰好出现n次,例如[0-9]\{4\}匹配4位数字 [1][0-9]\{10\}匹配手机号 |
| \ | 表示前面的字符出现不小于n次,例如[0-9]\{4,\}表示4位及以上的数字 |
| \ | 表示前面的字符至少出现n次,最多出现m次,例如[a-z]\{6,8\}匹配6到8位的小写字母 |
a* # 匹配所有的内容,包含空白行, 因为* 表示前面的字符出现0次或者多次,a*表示a可以出现huoch
a** # 匹配至少包含有一个a的字符串
aaa* # 匹配至少包含两个连续a的字符串
aaaaa* # 匹配至少包含四个连续a的字符串
[] # 匹配中括号中指定的任意一个字符,只匹配一个字符
"s[ao]id" # 匹配s和i字母中 要不是a,要不是o
"[0-9]" # 匹配任意一个数字
"^[0-9]" # 匹配以任意一个数字开头的字符串
[^] # 匹配除中括号的字符以为的任意一个字符
"^[^a-z]" # 匹配不是小写字母开头的行
"^[^a-zA-Z]" # 匹配不是字母开头的行
"\{n,\}" # 表示前面的字符出现不小于n次
"^[0-9]\{3,\}[a-z]" # 至少以3位数字开头的行且后面有一位小写字母
浙公网安备 33010602011771号