grep和正则表达式详解

前端之家收集整理的这篇文章主要介绍了grep和正则表达式详解前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一、Linux上文本处理三剑客

grep:文本过滤(模式:pattern)工具;

sed:文本编辑工具;

awk:Linux上的实现gawk,文本报告生成器;

二、grep

grep:Global search REgular expression and Print out the line,是一款文本过滤(模式:pattern)工具。

作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行;

模式:由正则表达式字符及文本字符所编写的过滤条件。

grep语法:

grep [OPTIONS] [PATTERN] [FILE...]

eg1:

wKiom1mKhJaS71cUAAAwV2OXqx4298.png-wh_50

eg2:

wKioL1mKhNDTQnY6AAAy2KBHqug253.png-wh_50

eg3:

wKioL1mKhQzAvX4aAAAdVL1HSB0059.png-wh_50

eg4:

wKiom1mKhjjAwIAOAAAwj_A_4Yk370.png-wh_50


OPTIONS:

--color=auto: 对匹配到的文本着色显示

-v: 显示不能够被pattern匹配到的行;

-i: 忽略字符大小写;

-n:显示匹配的行号;

-c: 统计匹配的行数;

-o: 仅显示匹配到的字符串;

-q: 静默模式,不输出任何信息;

-A #: after,后#行;

-B #: before,前#行;

-C #:context,前后各#行;

-e:实现多个选项间的逻辑or关系;

grep �Ce ‘cat ’ -e ‘dog’file

-w:整行匹配整个单词;

-E:使用ERE;

示例:

eg1:匹配除了root以外的所有行

wKiom1mKhteSpei5AABpz4cKcQg204.png-wh_50

eg2:

wKioL1mKh1iSMgVKAAAxx4yAgKc124.png-wh_50

eg3:

wKioL1mKh4WBE6lyAAA1CtQA_oU253.png-wh_50

eg4:

wKiom1mKh_CyHOrqAAA_TrSciAY366.png-wh_50

eg5:

wKioL1mKiBygUYfpAAAj4JUaUJY724.png-wh_50

eg6:

wKiom1mKiEyjZOgrAAAnRtk6G8U158.png-wh_50

eg7:

wKioL1mKiSGQEtI-AACAr_51KHg144.png-wh_50

eg8:

wKiom1mKiVSTA-pcAABqfpfz9sA338.png-wh_50

eg9:

wKioL1mKiZXztleSAACXuYNnbCw100.png-wh_50

eg10:

wKioL1mKijHj-PxxAABuXhz3cjQ572.png-wh_50

eg11:

wKiom1mKi9OSaFmmAAA1bjOujYk862.png-wh_50

三、正则表达式

3.1 正则表达式REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配功能

3.2 正则表达式分为两类:

3.2.1 基本正则表达式:BRE

3.2.2 扩展正则表达式:ERE

3.3 grep工具支持基本的正则表达式,egrep支持扩展的正则表达式,并且grep的-E选项其实就是egrep,fgrep不支持正则表达式搜索

3.4 正则表达式引擎:

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

3.4.2 PCRE(PerlCompatible Regular Expressions);

3.5 元字符分类:字符匹配、匹配次数、位置锚定、分组;

3.6 正则表达式详细使用帮助文档:man 7 regex;

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

字符匹配:

. :匹配任意单个字符;

[] :匹配指定范围内的任意单个字符

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

[:alnum:]所有的字母和数字

[:upper:] 所有的大写字母

[:lower:] 所有的小写字母

[:alpha:] 所有的字母(不区分大小写)

[:space:] 所有空白字符

[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)

[:digit:] 所有的数字

[:xdigit:]十六进制数字

[:graph:] 可打印的非空白字符

[:print:] 可打印字符

[:punct:] 所有的标点符号


eg1:

wKiom1mLEJ7hPlOtAABO20_B0ts537.png-wh_50

eg2:

wKiom1mLESDDEzeoAABa_VG3yrY579.png-wh_50

eg3:

wKioL1mLEpvhm0RnAAA71UP-5CA988.png-wh_50

次数匹配:用在要指定次数的字符后面,用于指定前面的字符要出现的次数

*:匹配前面的字符任意次,包括0次

贪婪模式:尽可能长的匹配

.*:任意长度的任意字符

\:转义符

\?:匹配其前面的字符0或1次

\+:匹配其前面的字符至少1次

\{n\}:匹配前面的字符n次

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

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

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


eg1:(vim f3,在f3文件添加以下内容,如图所示)

wKioL1mLE3qxHugHAAAR_XuSb1E669.png-wh_50


wKiom1mLE_zyZKDnAAAkDIu1jBM033.png-wh_50

eg2:

wKiom1mLFJiSqZsMAAAhaMkWeNI940.png-wh_50

eg3:

wKiom1mLFk2y9uh3AAAh8pfXpAU399.png-wh_50

eg4:

wKioL1mLF4Wg-F8_AAAfzwMY4gQ112.png-wh_50

eg5:

wKioL1mLF-XgL8aHAAAm41d6Pk4276.png-wh_50

eg6:

wKioL1mLGJHiTqKsAAAlbIcbnNY143.png-wh_50

eg7:

wKioL1mLGQPQ70WzAAAg2idnVc0842.png-wh_50


位置锚定:对特定的位置进行定位

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

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

^PATTERN$: 用于模式匹配整行

^$: 空行,不含有空白字符的行;

^[[:space:]]*$ :空白行,含有空白字符的行(空格和tab),匹配的时候包含空行;

\< 或 \b:词首锚定,用于单词模式的左侧

\> 或 \b:词尾锚定;用于单词模式的右侧

\<PATTERN\>:匹配整个单词


eg1:

wKiom1mLGX3xqD0ZAAAnZzYLYdc984.png-wh_50

eg2:

wKioL1mLGfqTGqw-AAEjxiDqnIc842.png-wh_50

eg3:

wKiom1mLGmrC1IM8AAAoKFSHYXk549.png-wh_50

eg4:

wKiom1mLGsPSylNcAAAT-oiIzPQ502.png-wh_50


wKioL1mLG1DxRK7zAAA4HyWDFaw649.png-wh_50

eg5:

wKioL1mLHQrjWCf-AAAq8kNEWbY504.png-wh_50

eg6:

wKiom1mLHabQsR-MAABWs7Sd-Eg732.png-wh_50

eg7:

wKiom1mLHeTyhQxeAAAzXsLaKvA642.png-wh_50

eg8:

wKiom1mLHlGyBUe0AAAkgSp6tto283.png-wh_50


分组

分组是指将一个或多个字符捆绑在一起,当做一个整体进行处理,其符号为:\(\);例如:\(root\)\+;

分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1,\2,\3,... ;

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

实例:\(string1\+\(string2\)*\)

\1: string1\+\(string2\)*

\2: string2

后向引用:引用前面的分组括号中的模式所匹配字符(而非模式本身)


eg1:vim f1,添加以下内容,如图所示

wKiom1mMd7TBCMAXAAARwX-SM0I490.png-wh_50


wKiom1mMeBijK1fCAAA4WLX9O50221.png-wh_50

eg2:vim f2,添加以下内容

wKiom1mMeFvghi7CAAAXB2bIf9k305.png-wh_50


wKiom1mMeR-Depg8AABWcvsPKYg743.png-wh_50


wKiom1mMelSxYpJaAABP14jbJp4569.png-wh_50


五、egrep及扩展的正则表达式

egrep=grep -E;

格式:egrep [OPTIONS] PATTERN [FILE...]


eg1:

wKiom1mMesaiW7JWAABxTQDx2LE313.png-wh_50


六、扩展正则表达式元字符

字符匹配

. 任意单个字符;

[] 指定范围的字符;

[^] 不在指定范围的字符;


次数匹配

*:匹配前面字符任意次;

.*:任意长度任意字符;

?: 0次或1次;

+:至少一次;

{m}:精确匹配m次;

{m,n}:至少m次,至多n次;

{m,}:至少m次;

{,n}:至多n次;


位置锚定

^ :行首;

$ :行尾;

\<,\b :语首;

\>,\b :语尾 ;


分组

符号:()

后向引用:\1,...

或者:

a|b:a或b;

C|cat: C或cat;

(C|c)at:Cat或cat;

猜你在找的正则表达式相关文章