正则表达式(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