grep正则表达式

grep正则表达式



一、grep

  • grep: Global search REgular expression and Print out the line

    • 作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行
  • 模式:由正则表达式字符及文本字符所编写的过滤条件

    • grep [OPTIONS] PATTERN [FILE…]
      • grep root /etc/passwd
      • grep “$USER” /etc/passwd
      • grep ‘$USER’ /etc/passwd
      • grep `whoami` /etc/passwd
  • grep命令选项
    • –color=auto: 对匹配到的文本着色显示
    • -v: 显示不被pattern匹配到的行
    • -i: 忽略字符大小写
    • -n:显示匹配的行号
    • -c: 统计匹配的行数
    • -o: 仅显示匹配到的字符串
    • -q: 静默模式,不输出任何信息
    • -A #: after, 后#行
    • -B #: before, 前#行
    • -C #:context, 前后各#行
    • -e:实现多个选项间的逻辑or关系
      • grep –e ‘cat ’ -e ‘dog’ file
    • -w:匹配整个单词
    • -E:使用ERE
    • -F:相当于fgrep,不支持正则表达式
    • -f file: 根据模式文件处理

二、正则表达式

  • REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能
  • 程序支持:grep,sed,awk,vim, less,nginx,varnish等
  • 分两类:
    • 基本正则表达式:BRE
    • 扩展正则表达式:ERE
      • grep -E, egrep
  • 正则表达式引擎:
    • 采用不同算法,检查处理正则表达式的软件模块
    • PCRE(Perl Compatible Regular Expressions)
  • 元字符分类:字符匹配、匹配次数、位置锚定、分组
  • man 7 regex

三、基本正则表达式元字符

  • 字符匹配:

    • . 匹配任意单个字符
    • [] 匹配指定范围内的任意单个字符,示例:[wang] [0-9] [a-z] [a-zA-Z] (或的关系)
    • [^] 匹配指定范围外的任意单个字符
    • [:alnum:] 字母和数字
    • [:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
    • [:lower:] 小写字母 [:upper:] 大写字母
    • [:blank:] 空白字符(空格和制表符)
    • [:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
    • [:cntrl:] 不可打印的控制字符(退格、删除、警铃…)
    • [:digit:] 十进制数字 [:xdigit:]十六进制数字
    • [:graph:] 可打印的非空白字符
    • [:print:] 可打印字符
    • [:punct:] 标点符号
  • 匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数

    • * 匹配前面的字符任意次,包括0次
      • 贪婪模式:尽可能长的匹配
    • .* 任意长度的任意字符
    • \? 匹配其前面的字符0或1次
    • \+ 匹配其前面的字符至少1次
    • \{n\} 匹配前面的字符n次
    • \{m,n\} 匹配前面的字符至少m次,至多n次
    • \{,n\} 匹配前面的字符至多n次
    • \{n,\} 匹配前面的字符至少n次
  • 位置锚定:定位出现的位置

    • ^ 行首锚定,用于模式的最左侧
    • $ 行尾锚定,用于模式的最右侧
    • ^PATTERN$ 用于模式匹配整行
      • ^$ 空行
      • ^[[:space:]]*$ 空白行
    • \< 或 \b 词首锚定,用于单词模式的左侧
    • > 或 \b 词尾锚定,用于单词模式的右侧
    • \<PATTERN> 匹配整个单词

取出IP地址

1
2
~]# ifconfig ens33 |  grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" | head -n1
192.168.52.234

  • 分组:() 将一个或多个字符捆绑在一起,当作一个整体处理,如:(root)+
  • 分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些
    变量的命名方式为: \1, \2, \3, …
  • \1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
    • 示例: (string1+(string2)*)
      • \1 :string1+(string2)*
      • \2 :string2
  • 后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身
  • 或者:|
    • 示例:a|b: a或b C|cat: C或cat (C|c)at:Cat或cat

显示abc出现三次

1
2
~]# grep "\(abc\)\{3\}" f1
abcabcabc

分组演示

1
2
3
4
5
6
7
[root@centos7 ~]# cat f1 
abc xyz abc xyz
xyz xyz
[root@centos7 ~]# grep "\(abc\).*\(xyz\).*\2" f1
|abc xyz abc xyz|
[root@centos7 ~]# grep "\(abc\).*\(xyz\).*\1" f1
|abc xyz abc| xyz

或者演示

1
2
3
4
5
6
7
8
9
10
[root@centos7 ~]# grep "\(^a\)\|\(^b\)" /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
[root@centos7 ~]# grep "\(^a\|^b\)" /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin

取出IP地址

1
2
~]# ifconfig ens33 | grep -o "\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}" | head -n1
192.168.52.234

精准取出IP地址

1
2
~]# ifconfig ens33 | grep -o "\b\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\b" | head -n1
192.168.52.234

-------------------码字不易尊重原创转载标注不胜感激-------------------
Yes or no?
0%