正则表达式和扩展正则表达式
先了解下基础概念:字符是计算机软件处理文字时最基本的单位,可能是字母,数字,标点符号,空格,换行符,汉字等等。字符串是0个或更多个字符的序列。文本也就是文字,字符串。说某个字符串匹配某个正则表达式,通常是指这个字符串里有一部分(或几部分分别)能满足表达式给出的条件。
正则表达式:是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。vim、grep、awk 、sed 等工具都支持正则表达式,本文介绍如何使用grep及egrep命令。而扩展正则表达式比基本正则表达式拥有更强大的功能。
简介
grep的主要功能用于检索文件内容,字符串等的工具。可以根据用户指定的“模式(pattern)”对目标文本进行搜索过滤,显示出被“模式pattern”匹配到的行。
其基本语法是:
grep [OPTIONS]PATTERN [FILE...]
PATTERN:是文本字符和正则表达式的元字符组合而成的匹配条件,可用单引号‘ ’将pattern括起来以避免shell通配的影响,强引用不替换而显示字符本身。" " 双引号,字符串中的` `,$,\ 等特殊字符会被shell解释替换后,再传递给grep。对普通的字符串(没有特殊字符和空格的字符串)也可以不加引号,直接搜索。
OPTIONS:(这里给出常用的选项)
-i 忽略大小写
-c 显示被匹配到的行数
-n 输出行号
-v 反向选择,即找没有搜索字符串的行
-w 匹配单词
-A # 连同匹配行的下#行一并显示,#代表任意数字
-B # 连同匹配行的上#行一并显示,#代表任意数字
-C # 连同匹配行的上下#行一并显示,#代表任意数字
-R或-r 递归搜索目录或子目录下匹配的字所在文件(可配合find命令
-E 相当于egrep支持扩展的正则表达式
-F 相当于fgrep不支持正则表达式
-V 显示grep版本
grep中不太常用的选项:
-P,--perl-regexp PATTERN 是一个 Perl 正则表达式
-q 取消显示,只返回退出状态。0则表示找到了匹配的行;找不到返回1,搜索的文件不存在返回2
-h--no-filename #在显示符合样式的那一列之前,不标示该列所属的文件名称。
-H --with-filename #在显示符合样式的那一列之前,表示该列所属的文件名称。(默认方式)
-L输出时只显示不包含匹配项的文件名,通常与-r选项连用来查找带指定内容的文件。
正则表达式: 默认匹配次数:贪婪模式,尽可能多的去匹配
. 匹配任意单个字符
\.表示.本身 \逃逸符
* 匹配其前面的字符任意次可为0次
.* 任意长度的任意字符
\? 匹配其前面字符1次或0次
@H_502_419@x\{m\}:匹配其前面的字符“x”m次(精确匹配) @H_502_419@x\{m,\}:匹配其前面的字符“x”至少m次 @H_502_419@x\{m,n\}:匹配其前面的字符“x”至少m次,至多n次\{1,\} 1次至无上限 \{0,3\}至少3次
^ 锚定行首,此字符后面的任意内容必须出现在行首
$ 锚定行尾,次字符前面的任意内容必须出现在行尾
^$表示空行
[ ] 匹配指定范围内的任意单个字符
[^ ] 匹配指定范围外的任意单个字符
\< 其后面的任意字符必须作为单词的首部出现\b
\> 其前面的任意字符必须作为单词的尾部出现\b
\<\> 锚定单词例如 \<root\>
@H_502_419@纯数字[[:digit:]]或[0-9]小写字母[[:lower:]]或[a-z]
大写字母[[:upper:]]或[A-Z]
大小写字母[[:alpha:]]或[a-zA-Z]
数字加字母[[:alnum:]]或[0-9a-zA-Z]
空白字符[[:space:]] 非空白字符[^[:space:]]
标点符号[[:punct:]]或[^a-zA-Z0-9]
\d 匹配任何十进制数,相当于[0-9]-P选项加上
@H_502_419@\D 匹配任何非数字字符,相当于[^0-9] -P选项加上 @H_502_419@\s 匹配任何空白字符,\S 匹配任何非空白字符,
\w 匹配任何字母数字字符,相当于[a-zA-Z0-9]
@H_502_419@\W 匹配任何非字母数字字符,相当于[^a-zA-Z0-9] @H_502_419@\\ 匹配"\" @H_502_419@\( \) 分组后项引用 \1 引用第一个左括号以及与之对应的右括号所包括的所有内容。\2 \3 …
+ 匹配其前面的字符至少1次\{1,\}正则中近似
?匹配紧挨在其前面的字符0次或1次\?正则中
{m,n}匹配前面字符至少m次至多n次 {1,}表示1至无限 {0,3}表示0-3
()分组 \1 \2 \3 …
| 或者
2. 举例说明
这里的-n显示了行号n.表示n后面跟0-1个字符
\.转义符
这里的-i忽略了匹配字符的大小写 o后面跟了…有3个字符被匹配到
-v忽略匹配项
nt* 表示匹配以n为开头后面可以没有t个字符,也可以出现多次
匹配on后面跟的任意长度字符
虽然可以用wc �l 显示行号但是比起-c来说慢了一点!-w匹配单词
锚定行首
列出非目录的行 total是啥?
锚定行尾
查找目录下文件中匹配的词
锚定词首
锚定词尾
在/etc/passwd文件中查找匹配o,并且至少出现2次的字符串的行。
显示以#开头的行后面跟一个或多个空白字符,且后面跟了任意非空白字符的行
显示非数字字母的字符
分组中grep和egrep的区别
显示root开头或bash结尾的行(扩展正则表达式独有)
这个7在文件内没有返回值为1,若是6在文件内有则返回0,大该编程有用吧!
演示到这里我的color没有在命令中显示为何会展示出颜色呢?其实我用的是alias别名啦,如图所示:当然可以不用别名,在grep前面加个\即可。
fgrep不支持正则表达式也就不举例了。虽然例子不多也比较基础,以后还会补上点实用的内容。若有不对请指出!
补充内容:
懒惰限定符
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
通配符:globbing
* 任意长度任意字符
? 任意单个字符
[] 匹配指定范围内的任意单个字符
[^] 匹配指定范围外的任意单个字符
纯数字[[:digit:]]或[0-9]
小写字母[[:lower:]]或[a-z]
大写字母[[:upper:]]或[A-Z]
大小写字母 [[:alpha:]]或[a-zA-Z]
数字加字母 [[:alnum:]]或[0-9a-zA-Z]
空白字符[[:space:]] 非空白字符[^[:space:]]
标点符号[[:punct:]]或[^a-zA-Z0-9]
为何我们五年前不曾相遇?