设为首页 收藏本站
查看: 1111|回复: 0

[经验分享] 正则表达式和grep文本搜索工具

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-4-1 08:32:52 | 显示全部楼层 |阅读模式
正则表达式和文本搜索工具介绍正则表达式:如果想搜索/etc/passwd文件中以root开头的行,对与人来说很容易理解,但是对与计算机来说就无法理解,这个时候就需要使用正则表达式来表达过滤条件了,让用户实现对文本的智能搜索。正则表达式就是由元字符及正常字符所书写的模式,其中的元字符不表示字符本身的意义,而是用于表达控制或通配等功能。

正则表达式的特点是:
1. 灵活性、逻辑性和功能性非常的强;
2. 可以迅速地用极简单的方式达到字符串的复杂控制。

grep:支持正则表达式,是一个文本搜索工具,根据用户指定的文本模式(正则表达式元字符以及正常字符组合而成),对目标文件进行逐行搜索,显示能匹配到的行。

egrep:支持扩展正则表达式,扩展正则表达式使用的元字符比基本正则表达式支持的元字符多一些,功能也要更强一些

fgrep:不支持正则表达式,但是搜索速度更快。

系统环境说明[iyunv@localhost ~]# cat /etc/redhat-release
CentOS release 6.6 (Final)
[iyunv@localhost ~]# uname -rm
2.6.32-504.el6.x86_64 x86_64
grep过滤命令参数说明和演示
grep语法:[OPTIONS] PATTERN [FILE...]

设置grep搜索显示颜色:
[iyunv@localhost ~]# alias grep="grep--color"
注意:这种方法只是临时有效,重启后会丢失,把别名设置到开机启动文件中,重启系统之后依旧有效。


grep参数:
-v:表示取反
-i:不区分字符的大小写
-E:支持扩展正则表达式
-A:-A 2 显示指定行和指定行的后两行 中间使用两个横线分割
-B:显示匹配到前面的指定行数
-C:表示匹配到的内容的上下的指定行数
-o:只输出匹配内容
-n:在行首显示行号
演示说明:
-i 参数演示说明:在/etc/passwd中搜索ROOT, 不区分大小写,第一次搜索的是ROOT但是没有搜索到,添加-i参数之后就匹配到了root,说明搜索不区分大小写了。
wKioL1UaxHuyvIyMAACXZbUAjFY031.jpg
-C 参数演示说明:搜索/etc/passwd中redhat参数和匹配内容的上下各一行。
wKiom1Uawz_Rg9zSAADNM6Ts_RQ135.jpg
-o 参数演示说明:搜索/etc/passwd中root参数,非root内容不予显示。
wKioL1UaxHzjSlCGAABJDkrT5x4215.jpg
-n 参数演示说明:输出匹配结果的行号。注意:这个行号不是按照匹配到的内容显示行号的,而是按照匹配行在文本中的所在行显示。
wKiom1Uawz_Al_YqAAB2HBYiVLs824.jpg
正则表达使命令字符匹配:.:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
[abc]  匹配字符集合内任意一个字符[a-z]
[:space:]:空白字符
[:punct:]:标点符号
[:lower:]:小写字母
[:upper:]: 大写字母
[:alpha:]: 大小写字母
[:digit:]: 数字
[:alnum:]: 数字和大小写字母


实例:
".":实例演示说明:显示/etc/passwd文件中,r开头t结尾,中间跟两个任意字符。
wKiom1Uaw0Dy9Ew0AACjAXCxInk362.jpg
[]:实例演示说明:显示/etc/passwd文件中包含FTP字符的行。
wKioL1UaxH3zpBPtAAHdTKA5Cd8669.jpg
显示/etc/passwd文件中包含数字的行。
wKiom1Uaw0DSLSaZAAE404qRQLo149.jpg
次数匹配:在期望匹配字符后面提供一个控制符,用于匹配* :重复0个或多个前面的一个字符,匹配其前面字符任意次
.*:匹配所有字符。^.*任意多个字符开头
工作与贪婪模式,尽可能长的匹配。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。
?:0次或1次;表示其左侧字符可有可无
+:1次或多次
{m}: m次;表示其左侧字符精确出现m次
{m,n}:至少m次,至多n次;

演示:
*:演示说明:显示/etc/passwd文件中r开头t结尾,中间要么出现包含o的内容,要么什么都不出现。
wKioL1UaxH2j4xMsAAEP9cnX68s813.jpg
.*:演示说明:显示/etc/passwd文件中r0开头t结尾,中间出现任意长度的任意字符。
wKiom1Uaw0Dx3xWZAAB6ofWZJhw106.jpg
?:演示说明:显示/etc/passwd文件中包含ro开头t结尾,中间的o要是要么不出现,要么出现一次的行。
wKioL1UaxH3i5sZYAAE6x3obAhY178.jpg
+:演示说明:显示/etc/passwd文件中包含ro开头t结尾,中间的o出现过1次或多次的行。
wKiom1Uaw0HiHSp_AAB-ajebAGM232.jpg
{m}:演示说明:显示/etc/passwd文件中包含ro开头t结尾,中间的o出现两次的行。
wKioL1UaxH2TfO5_AAB8pkay-2U951.jpg

位置锚定:^:行首
$:行尾
^$:匹配空白行
实例:
^:演示说明:显示/etc/passwd文件中以root开头的行
wKioL1UaxH3QkEOKAABCfF7U7io563.jpg
$:演示说明:显示/etc/passwd文件中以/bin/bash结尾的行

单词锚定:由非字符组成的连续的字符串
<:锚定词首
:锚定词首
>:锚定词尾,也可以用
:匹配PATTERN能匹配到的单词

示例:
<和:演示说明:显示/etc/passwd文件中以sh开头的单词
wKiom1Uaw1OQ0RilAACxaDtCFM0529.jpg
>和: 演示说明:显示/etc/passwd文件中以sh结尾的单词
wKioL1UaxI-RoI6cAAGKDLzy5eo093.jpg

分组:()重复单个字符直接在字符后面加上限定符号即可,但是如果想重复多个字符就不是限定符号可以搞定的,这个时候就需要用到分组。
分组的模式:在某次的具体匹配过程中所匹配到的字符,可以被grep记忆(保存于内置的变量中,这些变量是,,……),因此,还可以被引用
实例说明:
把括号中的root当成一类字符,在加上*表示,roo要么显示一次,要么就不显示。
wKiom1Uaw1OC_UT7AADyLLNX7-w638.jpg
显示:r..t匹配到的字符在结尾在出现一次,也就是匹配以r..t开头,以r..t结尾的文件
wKioL1UaxJCTeMtfAABnLnThJiA923.jpg
综合使用方法:找出/etc/passwd文件中的一位数或两位数;
# grep "<[0-9]{1,2}>" /etc/passwd

显示/boot/grub/grub.conf中以至少一个空白字符开头的行;
# grep "^[[:space:]]+" /boot/grub/grub.conf

显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;
# grep "^#[[:space:]]+[^[:space:]]+" /etc/rc.d/rc.sysinit


扩展正则表达式可以使用grep e或者egrep来使用
字符匹配:表示方法和grep一样,不在提供实例
.:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
次数匹配:说明:扩展正则表达式的次数匹配前面不需要加转移字符。
*:任意次
?:0或1次
+:至少一次
{m}:精确匹配m次
{m,n}:至少m次,至多n次
{m,}:至少m次
{0,n}:至多次

?和+:演示说明:和正则表达式的区别就在于没有加"\"
wKiom1Uaw1SQKgBYAADiL8nBjCc845.jpg
{}演示:同样也是没有加"\",使用起来方便了很多
wKioL1UaxJCw_YrTAACTJAoRsto609.jpg
位置锚定:^:锚定行首
$:锚定行尾
<,:锚定词首
>,:锚定词尾

wKiom1Uaw1SjzJ7OAAEbmvcwfUo451.jpg
分组:():不需要使用转义

引用:
,,

显示/etc/passwd文件中root开头root结尾的行
wKioL1UaxJGwzLYdAABTTvJTnBU380.jpg
或者:这个是基本正则表达式所不具备的功能,意思是使用两个条件一起搜索,两个条件可以同时满足,也可以只满足其中一个,但是不能一个都无法满足。

a|b:a或者b

演示说明:显示/etc/passwd文件中的redhat和centos用户的信息。
wKiom1Uaw1SCgMZfAACI5-WCXWU037.jpg
显示/etc/passwd文件中redhat和fedora的信息,但是由于没有fedora的信息所以只显示了redhat用户的信息。
wKioL1UaxJGw8722AABUrutpO_w651.jpg





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-52644-1-1.html 上篇帖子: bash循环控制语句之for循环 下篇帖子: python django中如何配置mysql参数 表达式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表