文本三剑客之grep及正则表达式用法

grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,与sed(文本过滤工具),awk(文本报告生成器)并称为Linux文本处理三剑客,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。

本节索引

一、文本三剑客之grep介绍

二、正则表达式的相关概念

三、基本正则表达式(BER)

四、拓展正则表达式(ERE)

五、正则表达式中的元字符与通配符的使用区别

 

timg_image&quality=80&size=b9999_10000&sec=1523187795674&di=cac36899b69d5639ae19

 

一、文本三剑客之grep介绍:

grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。

 

Linux文本处理三剑客:

grep:文本过滤工具

sed:文本编辑工具(传送门)

awk:Linux上的实现gawk,文本报告生成器(传送门)

 

grep基于行过滤的文本过滤工具

格式:

grep [OPTION]… PATTERN [FILE]…

option:

-v     显示不被匹配到的行

-i      忽略字符大小写

-n     添加匹配到的行的行号

-c     统计被匹配到的行数

-o     仅显示匹配到的字符

-q     静默模式

-A#   包含此匹配行和后#行

-B#   包含此匹配行和前#行

-C#   包含此匹配行和前后#行

-e     实现多个匹配字符的或者(or)关系 -e a -e b:a或b

-w    匹配整个单词,数字、字母、下划线都算单词一部分

-r      递归目录

-E     使用ERE,扩展的正则表达式

-F     相当于fgrep

 

grep工具之所以功能强大,是因为它支持正则表达式进行匹配,那什么又是正则表达式呢?

 

二.正则表达式的相关概念

1.正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符。元字符使正则表达

式具有处理能力。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规

定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式

正则表达式(REGEXP):由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不

表示字符表面意义,而表示控制或通配功能

 

2.正则表达式与通配符的区别:通配符匹配的是文件名中的字符,不能匹配文件的文本内容的字符

串(详见前篇:带你认识Linux中的通配符),这时候就需要用到正则表达式。

 

 

3.正则表达式分两类:

基本正则表达式:BRE;只承认的元字符有^$.[]*其他字符识别为普通字符:\(\)需要转义

扩展正则表达式:ERE;则添加了(){}?+|等

grep -E,egrep

 

4.正则表达式引擎:

采用不同算法,检查处理正则表达式的软件模块

基于PCRE语言(逐渐没落)兼容的正则表达式

 

5.元字符分类:字符匹配、匹配次数、位置锚定、分组(帮助文档:man 7 regex)

 

三、基本正则表达式(BRE)的元字符介绍:

1.字符匹配:

.        匹配任意单个字符,放在[]中就表示点

[]      匹配括号内任意单个字符

[^]    匹配指定范围外的任意单个字符

[:alnum:] 任意一个字母和数字

[:alpha:]  任意一个字母

[:lower:]  任意一个小写字母

[:upper:]  任意一个大写字母

[:digit:]    任意一个数字

[:space:]  水平或垂直空白字符

[:punct:]  标点符号

注意:正则表达式使用字符集作为搜索条件时,一定要加双引号,如”[[:digit:]]”;否则正则表达式会将字符集作为一个个字符进行识别

转义符“\”使正则表达式中具有特殊含义的字符显示其本身,如\.只表示小数点

 

2.匹配次数(某个字符出现的次数)

*       匹配前面的字符任意次,包括0次(贪婪模式,尽可能长的匹配)

.*     任意长度的任意字符

\?   匹配前面的字符0或1次,可看做 \{0,1\}

\+     匹配前面的字符至少1次,可看做\{1,\}(可实现懒惰模式)

\{m\}        精确匹配前面的字符m次

\{m,\}   至少匹配前面的字符m次

\{,m\}      至多匹配前面的字符m次

\{m,n\}匹配前面的字符m到n次

 

3.位置锚定

^       行首锚定,用于模式最左侧

$       行尾锚定,用于模式最右侧

^$    表示空行

\<或\b     单词的词首锚定

\>或\b     单词的次尾锚定

\<word\> 匹配整个单词,同grep -w

 

4.分组

\(\)将一个或多个字符捆绑在一起,当做一个整体进行处理,如:\(root\)\+

分组括号中匹配到的内容会被正则表达式记录与内部变量中,这些变量命名方式

为:\1,\2,\3,…

\1表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符

 

后向引用:\1表示的是前面匹配的结果而不是前面匹配的模式

例:echo rootxxrbbt|grep ‘\(r..t\).*\1’

\1代表root,而不是r..t

 

5.或者:\|

例:a\|b:a或b; C\|cat:C或cat \(C\|c\)at:Cat或cat

 

 

四、扩展正则表达式(ERE)元字符介绍:

egrep      同grep -E

扩展正则表达式(ERE)可理解为将基础正则表达式中的转义符全部去掉,其字符匹配与基础正则表达式(BRE)相同。

1.次数匹配:

*       匹配前面字符任意次

?    0或1次,可看做{0,1}

+       1次或多次.可看做{1,}

{m}  匹配m次

{m,n}        匹配m到n次

 

2.位置锚定:

^       行首

$       行尾

\<,\b        语首

\>,\b       语尾

 

3.分组:

()

后向引用:\1,\2,…

 

4.或者:

a|b  a或b

C|cat       C或cat

(C|c)at       Cat或cat

 

五、正则表达式中的元字符与通配符的区别

作用不同:通配符匹配的是文件名中的字符,而正则表达式匹配的是文件的文本内容的字符串;

两者之间有很多相同之处,也有不同点,其中:

1.正则表达式元字符与通配符代表意义不同的有:

通配符中:

* 表示任意长度的任意字符

? 表示任意一个单个字符

正则表达式:

*表示匹配前面的字符任意次

. 表示匹配任意一个单个字符

.*表示任意长度的任意字符

 

2.正则表达式元字符与通配符含义相似的有:

[]      匹配括号内任意单个字符

[^]    匹配指定范围外的任意单个字符

[:alnum:] 任意一个字母和数字

[:alpha:]  任意一个字母

[:lower:]  任意一个小写字母

[:upper:]  任意一个大写字母

[:digit:]    任意一个数字

[:space:]  水平或垂直空白字符

[:punct:]  标点符号

…等字符集

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/95103

(6)
wangxczwangxcz
上一篇 2018-04-07 10:10
下一篇 2018-04-07 11:42

相关推荐

  • 计算机的组成及其功能

    计算机(computer)俗称电脑,常用于进行数值计算、逻辑计算,除此之外还带有存储记忆功能。 计算机主要由五个部分组成。 (1)运算器 运算器(ALU,Arithmetic Logic Unit),基本功能是完成对各种数据的加工处理,主要负责完成计算机中的算术运算(即加、减、乘、除以及相应的复合运算)和逻辑运算(与、或、非等逻辑运算以及数据的比较和移位等操…

    Linux笔记 2018-05-13
  • 第三周博客作业

    1、列出当前系统上所有已登录的用户名,注意:同一用户登陆多次,则只显示一次即可。
    2、取出最后登录到当前系统的用户的相关信息。
    3、取出当前系统上被用户当作默认shell的最多的那个shell。
    4、将/etc/passwd中的第三个字段数值最大的后10个用户的信息全部改为大写后保存至/tmp/maxusers.txt文件中。
    5、取出当前主机的IP地址,提示:对ifconfig命令的结果进行切分。
    6、列出/etc目录下所有以.conf结尾的文件的文件名,并将其名字转换为大写后保存至/tmp/etc.conf文件中。
    7、显示/var目录下一级子目录或文件的总个数。
    8、取出/etc/group文件中第三个字段数值最小的10个组的名字。
    9、将/etc/fstab和/etc/issue文件的内容合并为同一个内容后保存至/tmp/etc.test文件中。
    10、请总结描述用户和组管理类命令的使用方法并完成以下练习:

    Linux笔记 2018-03-27
  • 源码编译安装 MariaDB

    基础软件 yum install bison bison-devel zlib-devel libcurl-devel libarchive-devel boost-devel gcc gcc-c++ cmake ncurses-devel gnutls-devel libxml2-devel openssl-devel libevent-devel lib…

    Linux笔记 2018-06-24
  • Linux用户和组简介

    练习为主

    Linux笔记 2018-07-08
  • centos6.9启动之grub

    本文主要介绍系统启动中grub部分

    2018-05-13
  • 转义字符Escape character在正则中的用法

    通过()的在基本正则和扩展正则中的不同使用,详细介绍了转义字符的使用注意事项

    Linux笔记 2018-04-13

评论列表(1条)

  • M30-Alvin阿峰
    M30-Alvin阿峰 2018-04-16 11:33

    grep ‘^$’ f1 | wc -l
    grep -c ‘^$’ f1
    上面两个是等价写法