Shell正则表达式——grep命令和egrep

正则表达式

正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。

概念

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

简介

正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。

grep命令

-a 或 --text : 不要忽略二进制的数据。
-A<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
-b 或 --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
-B<显示行数> 或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
-c 或 --count : 计算符合样式的列数。
-C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
-d <动作> 或 --directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
-e<范本样式> 或 --regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
-E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。
-f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
-F 或 --fixed-regexp : 将样式视为固定字符串的列表。
-G 或 --basic-regexp : 将样式视为普通的表示法来使用。
-h 或 --no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
-H 或 --with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。
-i 或 --ignore-case : 忽略字符大小写的差别。
-l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
-L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。
-n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
-o 或 --only-matching : 只显示匹配PATTERN 部分。
-q 或 --quiet或–silent : 不显示任何信息。
-r 或 --recursive : 此参数的效果和指定"-d recurse"参数相同。
-s 或 --no-messages : 不显示错误信息。
-v 或 --revert-match : 显示不包含匹配文本的所有行。
-V 或 --version : 显示版本信息。
-w 或 --word-regexp : 只显示全字符合的列。
-x --line-regexp : 只显示全列符合的列。
-y : 此参数的效果和指定"-i"参数相同

查找特定字符

#过滤出带有the 的行,并显示行号
[root@1centos zhengzebiaodashi]# grep -n 'the' wenben.sh   
3:the tongue is boneless but it breaks bones.12! google is the best tools for search keyword.
4:The year ahead will test our political establishment to the limit.

 #不区分大小写过滤出带有the的行,显示行号
[root@1centos zhengzebiaodashi]# grep -ni 'the' wenben.sh 
2:He was wearing a blue polo shirt with black pants. The home of Football on BBC Sport online.
3:the tongue is boneless but it breaks bones.12! google is the best tools for search keyword.
4:The year ahead will test our political establishment to the limit.

#过滤出没带有the的行,显示行号
[root@1centos zhengzebiaodashi]# grep -nv 'the' wenben.sh 
1:s short and fat.
2:He was wearing a blue polo shirt with black pants. The home of Football on BBC Sport online.
5:PI=3.141592653589793238462643383249901429
6:a wood cross!
7:Actions speak louder than words
8:
9:
10:#woood
11:# #woooooood #
12:AxyzxyzxyzxyzC
13:I bet this place is really spooky late at night! Misfortunes never come alone/single.
14: 
15:I shouldn't have lett so tast.
16:

利用中括号过滤字符

[root@1centos zhengzebiaodashi]# grep -n 'sh[io]rt' wenben.sh 
1:s short and fat.                        ###short 里带着o
2:He was wearing a blue polo shirt with black pants. The home of Football on BBC Sport online.                       ###shirt里带着 i
[root@1centos zhengzebiaodashi]# 

查找不以 w 开头,且 包含 oo 的行

[root@1centos zhengzebiaodashi]# grep -n '[^w]oo' wenben.sh 
2:He was wearing a blue polo shirt with black pants. The home of Football on BBC Sport online.
3:the tongue is boneless but it breaks bones.12! google is the best tools for search keyword.
10:#woood
11:# #woooooood #              ///  o oo  oo前面有个o
13:I bet this place is really spooky late at night! Misfortunes never come alone/single.
[root@1centos zhengzebiaodashi]# 

查找oo前面不是小写字母的行

[a-z] 小写全部字母
[A-Z] 大写全部字母

[root@1centos zhengzebiaodashi]# grep -n '[^a-z]oo' wenben.sh 
2:He was wearing a blue polo shirt with black pants. The home of Football on BBC Sport online.

查找以数字结尾的行

[0-9] 包含全部数字

[root@1centos zhengzebiaodashi]# grep -n '[1-9$]' wenben.sh 
3:the tongue is boneless but it breaks bones.12! google is the best tools for search keyword.
5:PI=3.141592653589793238462643383249901429
[root@1centos zhengzebiaodashi]# grep -n '[0-9$]' wenben.sh 
3:the tongue is boneless but it breaks bones.12! google is the best tools for search keyword.
5:PI=3.141592653589793238462643383249901429
[root@1centos zhengzebiaodashi]# 

得出:^ 在 [ ] 里面和外面是不一样的,在里面表示反选,在外面表示以啥啥开头

查找任意一个你忘了的字符

[root@1centos zhengzebiaodashi]# grep 'cr.ss' wenben.sh 
a wood cross!

也可以连续查

[root@1centos zhengzebiaodashi]# grep 'w...d' wenben.sh 
#woood

也可以分开查

[root@1centos zhengzebiaodashi]# grep 's.e.k' wenben.sh 
Actions speak louder than words

查找连续重复字符

wod不会出现,因为*表示: * 前面的文字有零个或多个

[root@1centos zhengzebiaodashi]# grep -n 'wo*d' wenben.sh 
6:a wood cross!
10:#woood
11:# #woooooood #

查找包含任意数字所在的行

[root@1centos zhengzebiaodashi]# grep -n '[0-9][0-9]*' wenben.sh 
3:the tongue is boneless but it breaks bones.12! google is the best tools for search keyword.
5:PI=3.141592653589793238462643383249901429
8:1

与 . 连起来使用

查找 w 到 d 中间可有可无字符的行

[root@1centos zhengzebiaodashi]# grep -n 'w.*d' wenben.sh 
3:the tongue is boneless but it breaks bones.12! google is the best tools for search keyword.
6:a wood cross!
7:Actions speak louder than words
10:#woood
11:# #woooooood #

查找限制范围的连续重复字符

在文本中新增了两行方便观察
13 wwod
14 wwwwoooooood

[root@1centos zhengzebiaodashi]# grep -n 'wo\{2\}' wenben.sh 
6:a wood cross!
11:#woood
12:# #woooooood #
14:wwwwoooooood           ///这边是以 woo 过滤出的

限制范围

查找 w开头后面有2-5个o的行

[root@1centos zhengzebiaodashi]# grep -n 'wo\{2,5\}' wenben.sh 
6:a wood cross!
11:#woood
12:# #woooooood #
14:wwwwoooooood

查找以w 开头,d结尾,中间有2-5个o的行

[root@1centos zhengzebiaodashi]# grep -n 'wo\{2,5\}d' wenben.sh 
6:a wood cross!
11:#woood

查找以w 开头,d结尾,中间有2个以上o的行

[root@1centos zhengzebiaodashi]# grep -n 'wo\{2,\}d' wenben.sh 
6:a wood cross!
11:#woood
12:# #woooooood #
14:wwwwoooooood

元字符总结

元字符 作用
^ 匹配输入字符串的开始位置。除非在方括号表达式中使用,表示不包含该字符集合。要匹配“^” 字符本身,请使用“反斜杠^”
$ 匹配输入字符串的结尾位置。如果设置了RegExp 对象的 Multiline 属性,则“KaTeX parse error: Undefined control sequence: \n at position 6: ”也匹配‘\̲n̲’或‘\r’。要匹配“”字符本身,请使用“反斜杠$”
. 匹配除“\r\n”之外的任何单个字符
\ 反斜杠,又叫转义字符,去除其后紧跟的元字符或通配符的特殊意义
* 匹配前面的子表达式零次或多次。要匹配“”字符,请使用“反斜杠
[] 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”
[^] 赋值字符集合。匹配未包含的一个任意字符。例如,“[^abc]”可以匹配“plain”中任何一个字母
[n1-n2] 字符范围。匹配指定范围内的任意一个字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意一个小写字母字符
{n} n 是一个非负整数,匹配确定的 n 次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的“oo”
{n,} n 是一个非负整数,至少匹配 n 次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*
{n,m} m 和 n 均为非负整数,其中 n<=m,最少匹配 n 次且最多匹配m 次

egrep命令

基本上grep已经够用了……
egrep有时候比grep好用,有时候比grep难用
grep仅支持基础正则表达式,egrep支持拓展正则表达式

扩展正则表达式常见元字符

元字符 作用
+ 作用:重复一个或者一个以上的前一个字符
作用:零个或者一个的前一个字符
打不出来 管道符号 示例:执行“egrep -n ‘bes?t’ test.txt”命令,即可查询“bet”“best”这两个字符串
() 作用:查找“组”字符串
()+ 作用:辨别多个重复的组

grep 过滤 W开头 C结尾中间包含一个以上xyz的行

[root@1centos zhengzebiaodashi]# grep -n 'A[xyz]\{1,\}C' wenben.sh 
15:AxyzxyzxyzxyzC

egrep 过滤 W开头 C结尾中间包含一个以上xyz的行

[root@1centos zhengzebiaodashi]# egrep -n 'A(xyz)+C' wenben.sh
15:AxyzxyzxyzxyzC

猜你喜欢

转载自blog.csdn.net/Ora_G/article/details/107578077