您的位置:首页 > 其它

grep、egrep及相应的正则表达式和用法

2016-03-10 11:43 253 查看
正则表达式 :
由一类特殊字符及文本字符所编写的模式,用来描述或者匹配符合某个语句里面的字符串,表示的是通配或者控制的功能,在很多文本编辑器里面,正则表达式就是用来通配或者检索替换某些符合所编写的模式里的内容。通常说某个字符串匹配某个正则表达式,指的是这个字符串里有一部分(或者几个部分)能满足正则表达式所给出的条件。
常用的是工具有grep,sed, awk,俗称Linux文本处理三剑客。
grep,egrep:文本搜索工具,基于所给定的模式来对给文本进行搜索操作
sed:流编辑器,行编辑器
awk:文本格式化工具
正则表达式分为两类:
1.基本正则表达式:grep
2.扩展正则表达式:egrep
fgrep是不支持使用正则表达式的,主要用来快速的搜索。
1、grep命令: 文本搜索工具,基于给定的“pattern(过滤条件)”来对文本进行匹配搜索。
常用选项:
--color=auto:对匹配到的内容进行高亮显示
-i: 忽略大小写 grep -i /etc/passwd
-o:只显示匹配到的内容 grep -o 'root' /etc/passwd
-v:反向匹配 ,不包含所选字符 grep -v 'root' /etc/passwd
-E:支持扩展正则表达式,相当于egrep
-e:支持多模机制 grep -e 'root' -e 'hadoop' /etc/passwd
-f:支持使用脚本机制 grep -f myfile(脚本) /etc/passwd

正则表达式有两种表示:
1、一般字符:没有特殊意义的字符
2、特殊字符:元字符,在正则表达式中有特殊意义
基本正则表达式元字符:

1、 字符匹配:
.: 表示匹配任意单个字符



注意:/和空白也表示一个字符

[]: 表示匹配范围内的任意字符

[^]:表示匹配范围外的任意字符



2、 匹配次数: 注意:grep只是做部分匹配,和global做整个字符匹配是有所不同的
用在要指定匹配其出现次数的字符的后面,用来限制前面的字符出现的次数
*:匹配前面的字符多次,可以是0次,1次,2次或多次。



.*:匹配任意长度的字符。



\+:匹配前面的字符至少一次。



\?:匹配前面的字符至多一次,可以是0次,也可以是1次,可有可无。



\{m\}:其前面的字符出现M次,M为非负整数。
\{m,n\}:至多出现n次,至少m次。
\{0,n\}:至多n次。
\{m,\}:至少m次。



示例中: grep ‘a\{2\}’test.txt
只对a匹配两次为什么会出现aaaa,因为只要字符串的一部分(几部分)满足正则表达式的条件就能搜索出来。 3、位置锚定:

使用过滤条件去搜索文本,限制其所匹配的内容必须出现在文本的哪个位置
^:行首锚定,限制其内容必须在最左侧。
$:行尾锚定,限制其内容必须在最右侧。
^$:表示的是空行 ^[[:space:]]$:表示的是空白行



有时候使用行首锚定可能会出现和自己所需要出现的结果不用,像例子中匹配root在行首的文本,出现了rookit这一行
,这时我们可以用到下面说到的词尾锚定。
\<:词首锚定,用于匹配单词模式的左侧
\>:词尾锚定,用于匹配单词模式的右侧
单词:表示有非特殊字符组成的连续字符串或者字符。




例如:在/etc/passwd目录下,找出以root为行首,且已root结尾的行。




4、 分组与引用:
\(pattern\):将此pattern匹配到的字符作为一个不可拆分的整体。
示例: pat\(pat1\)\pat2\(pat3\(pat4\)\)
Note:分组括号中的模式匹配到字符会被正则表达式引擎自动记录于内部的变量中,这些变量是\1,\2,\3......
\1:第一组括号中的pattern匹配到的字符串
\2:第二种括号中的pattern匹配到的字符串
\n:模式中第n个左括号以及与之匹配的右括号之间的模式所匹配到的字符串
规则:自左向右,以分组左括号为为标志,第一个出现分组的组号为1,第二个为2,以此类推。。。
后向引用:引用前面的括号中的模式所匹配到的字符串
后向引用来表示重复搜索前面某个分组所匹配到的文本,例如:\1:代表分组1所匹配到的文本
举例:在/etc/passwd目录下有bash,testbash,basher及nologin,它们的默认shell分别是/bin/bash、/bin/bash、/bin/bash 及/sbin/nologin,现在需要找出用户名和shell相同的用户。




egrep: 支持使用扩展正则表达式的grep命令,相当于grep -E
egrep [OPTIONS] PATTERN [FILE...]
扩展表达式元字符:
字符匹配:
. :匹配任意单个字符
[] :匹配范围内的任意单个字符
[^] :匹配范围外的任意单个字符
匹配次数:(不需要转义字符 \ )

*:匹配前面的字符任意次(0,1或多次);
+:匹配前面的字符至少一次:
?:匹配前面的0次或1次,即前面的字符可有可无;
{m}:其前面的字符出现M次,M为非负整数
{m,n}:至多出现n次,至少m次
{0,n}:至多N次
{m,}:至少m次
位置锚定:和grep的位置锚定一样,转义字符 \ 不能去掉
分组引用:(pattern):将此pattern匹配到的字符作为一个不可拆分的整体。
示例: pat\(pat1)\pat2\(pat3\(pat4))
后向引用:\1,\2.....
或者:
a|b:a或者吧
C|cat:表示C或者cat
(C|c)at:表示Cat或者cat
举例:1、显示当前系统上root、centos、和slackware用户的相关信息



2、echo一个绝对路径,使用egrep取出其基名



如果是/tmp/slackware/,这样是egrep是获取不到的,可以用 '[^/]+/?$ ' ,/?表示前面的/是可有可无的。
3、找出ifconfig命令结果中的1-255的整数


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: