正则表达式(REGEXP)
正则表达式概念:
元字符:含有特定含义的特殊字符。
REGEXP: Regular Expressions,是一种模式。通过使用元字符匹配文件中的字符或者字符串的
通配符: 是用来匹配文件名,不能用来匹配字符串(通配符只能用来匹配现有文件的,不能用来生成文件
正则表达式分类:
- 基本正则表达式:
需要加转义字符\grep默认使用的就是基本正则表达式 - 扩展正则表达式: 更简洁,书写的时候可以
不加转义字符(\)了 。如:? + {n}等
正则表达式基本元字符:
第一类:字符匹配
(1) . --- 单个任意字符(类似于通配符的 ?)
(2) [] --- 表示其中的任意一个
- 里面匹配出来的是纯小写或大写字符,不像通配符一样有小写有大写
- 也支持通配符的写法: 表示小写字母: [[: lower :]]
- 中括号里面放什么东西就是表示本身的含义 比如: [.] -- 表示的就是点(.),不表示单个字符的意思
[^] --- 除括号中指定字符外的任意一个字符
第二类:次数匹配:
描述一个字符出现多少次
(1) \{num\} -- 前一个字符出现num次
需要加转移字符(\)
- 表示前一个字符出现的次数:\{ num \}
- 表示一个区间范围:\{n1,n2\}
(2) * --- 前一个字符出现任意次
- 通配符表示的是任意长度的字符
- 贪婪模式: 能匹配的都匹配出来
点星(.*):表示任意多个字符
(3) \? --- 前面字符出现一次或者零次
- 因为通配符的?是一个字符的意思,通配符是shell的,运行的程序又是shell的子进程,所以加个转义字符。过了shell后就变成了? ,然后再给程序使用。
- 懒惰模式: 尽可能少匹配
(4) \+ --- 前面的字符出现一次以上
第三类:位置锚定
^ --- 脱字符,表示整行的行首(行首锚定)
- 行首后面跟个字符串 表示以这个字符串作为开头的行
- 写在中括号里面的脱字符表示排除的意思 [^xx]
$ --- 整行的行尾(行尾锚定)
例如:string $ --- 以指定字符结尾的行
^str$ ---- 只包含str字符串的行(^$ --- 表示空行)
单词匹配:
linux中字母、数字、下划算都算单词,其他的就是单词的分界符
连续的 字母、数字、下划线 才算单词
- 单词的词首 --- \< --- \b
- 单词的词尾 ---- \> --- \b
- 整个单词 ---- \< str \>
第四类:分组和其他功能
分组:
形成一个整体: \( \)
例如: abc出现三次 (abc){3}
或(\|):
使用的时候要加转义字符 \
正则表达式扩展元字符:
基本正则表达式不加转义字符(\)。比如次数匹配类、单词匹配和分组的元字符。
例如:{}、()、?、+、|、<、>、b
支持正则表达式的工具:
grep、sed、awk、vim编辑器
范例:获取IP地址
ifconfig ens33 | grep -i inet | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | head -1
简化:ifconfig ens33 | grep -i inet | grep -o '\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}' | head -1