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

[经验分享] grep与正则表达式

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-5-23 08:36:42 | 显示全部楼层 |阅读模式
一、grep命令的用法
grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来.
参数:
1. -A NUM,--after-context=NUM   除了列出符合行之外,并且列出后NUM行。
如:   $ grep –A 1 panda file  (从file中搜寻有panda样式的行,并显示该行的后1行)

2. -B NUM,--before-context=NUM  与 -A NUM 相对,但这此参数是显示除符合行之外并显示在它之前的NUM行。如:    (从file中搜寻有panda样式的行,并显示该行的前1行)
$ grep -B 1 panda file

3、 -C [NUM], -NUM, --context[=NUM]  列出符合行之外并列出上下各NUM行,默认值是2。
如:    (列出file中除包含panda样式的行外并列出其上下2行)(若要改变默认值,直接改变NUM即可)
$ grep -C[NUM] panda file

4、 -c, --count  不显示符合样式行,只显示符合的总行数。若再加上-v,--invert-match,参数显示不符合的总行数

5、-i,--ignore-case 忽略大小写差别

6、-n,--line-number 在匹配的行前面打印行号

7、-v,--revert-match  反检索,只显示不匹配的行

8、精确匹配:
例如在抽取字符串“ 48”,返回结果包含诸如484和483等包含“48”的其他字符串,实际上应精确抽取只包含48的各行。注意在每个匹配模式中抽取字符串后有一个<Tab>键,所以应操作如下
#grep "48<tab>" filename
使用grep抽取精确匹配的一种更有效方式是在抽取字符串后加\>。假定现在精确抽取48,
方法如下:
#grep '48\>' filename

9、-s 不显示不存在或无匹配文本的错误信息
如:执行命令grep "root" /etc/password,因为password文件不存在,所以在屏幕上输出错误信息,若使用grep命令-s开关,可屏蔽错误信息
要用好grep这个工具,其实就是要写好正则表达式,所以这里不对grep的所有功能进行实例讲解,只列几个例子,讲解一个正则表达式的写法。
$ ls -l | grep '^d'
通过管道过滤ls -l输出的内容,只显示以d开头的行。
$ grep 'test' d*
显示所有以d开头的文件中包含test的行。
$ grep 'test' aa bb cc
显示在aa,bb,cc文件中匹配test的行。
$ grep '[a-z]\{5,\}' aa
显示所有包含每个字符串至少有5个连续小写字符的字符串的行。
$grep  t[a|e]st  filename
显示包含test或tast的所有行。
$grep  '\.$'  filename
显示以.为结尾的所有行。

二、正则表达式:
正则表达式(或称Regular Expression,简称RE)就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。简单的说,正则表示式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为, 正则表示式通过一些特殊符号的辅助,可以让使用者轻易的达到搜寻/删除/取代某特定字符串的处理程序。vim、grep、find、awk、sed等命令都支持正则表达式。
常用正则表达式:
1、.代表任意单个字符, 如:/l..e/与包含一个l,后跟两个字符,然后跟一个e的行相匹配
   ? 匹配零个或一个字符。如:'gr?p'匹配gr后跟一个或没有字符,然后是p的行
2、^代表行的开始。 ^love 如:与所有love开头的行匹配
3、$代表行的结束。love$ 如:与所有love结尾的行匹配
那么‘^$’ 就表示空行
4、[…]匹配括号中的字符之一
[abc]      匹配单个字符a或b或c  
[123]            匹配单个字符1或2或3
[0-9]             匹配0-9任意数字         
[a-z]      匹配小写字母a-z之一
[a-zA-Z]    匹配任意英文字母之一
[0-9a-zA-Z]匹配任意英文字母或数字之一

[:digit:]   所有数字    [[:digit:]]等同于[0-9]
[:lower:]   所有小写字母  [[:lower:]]等同于[a-z]
[:upper:]   所有大写字母  [[:upper:]]等同于[A-Z]
[:alpha:]   所有字母      [[:alpha:]]等同于[a-zA-Z]
[:alnum:]   所有数字和字母 [[:alnum:]]等同于[0-9a-zA-Z]
[:sapce:]   空白字符
[:punct:]   所有标点符号
注意:上面标红色的单个和之一,不管[]里面多复杂,它的结果都是一个字符!
可以用^标记做[]内的前缀,表示除[]内的字符之外的字符。比如 搜索oo前没有g的字符串的行. 应用 '[^g]oo' 作搜索字符串,^符号如果出现在[]的起始位置表示否定,但是在其他位置是普通字符。[^ab^c] 匹配不是a或b或^或c的任意字符

5、* 用于修饰前导字符,表示前导字符出现0次或任意多次,如:'a*grep'匹配所有0个或多个a后紧跟grep的行。“.*”表示任意字符串

6、\? 用于修饰前导字符,表示前导字符出现0或1次

7、\+ 用于修饰前导字符,表示前导字符出现1或多次

8、\{n,m\}  用于修饰前导字符,表示前导字符出现n至m次 (n和m都是整数,且n<m)
\{n,m\}还有其他几种形式:
\{n\}  连续的n个前导字符
\{n,\}  连续的至少n个前导字符

9、\  用于转义紧跟其后的单个特殊字符,使该特殊字符成为普通字符
如:^\.[0-9][0-9] 对以一个句点和两个数字开始
注:以上“前导字符”表示紧贴于元字符前面的单个普通字符
例如:
a* 匹配连续的任意(也包括0)个a
a\? 匹配0或1个a
a\+ 匹配1或多个a
a\{3,5\} 匹配3至5个连续的a
\.* 匹配0或多个连续的.  \.表示普通字符句点

10、|表示或  如: a|b|c 匹配a或b或c。如:grep|sed匹配grep或sed

11、(),将部分 内容合成一个单位组,比如 要搜刮 glad 或 good 可以如许 'g(la|oo)d'
综合举例1:
1 Christian Scott lives here and will put on a Christmas party.
2 There are around 30 to 35 people invited.
3 They are:
4  Tom
5 Dan
6  Rhonda Savage
7 Nicky and Kimerly.
8 Steve, Suzanne, Ginger and Larry.
^[A-Z]..$
搜索行以A至Z的一个字母开头,然后跟两个任意字母,然后跟一个换行符的行。将找到第5行。
^[A-Z][a-z]*3[0-5]
搜索以一个大写字母开头,后跟0个或多个小写字母,再跟数字3,再跟0—5之间的一个数字。
^ *[A-Z][a-z][a-z]$
搜索以0个或多个空格开头,跟一个大写字母,两个小写字母和一个换车符。将找到第4行的TOM(整行匹配)和第5行。注意,*前面有一个空格。
^[A-Za-z]*[^,][A-Za-z]*$
将查找以0个或多个大写或小写字母开头,不跟逗号,然后跟0个或多个大写或小写字母,然后跟一个换车符。将找到第4和5行。
综合举例2:
# ls -l | grep '^...s'
上面的命令是用来查找suid文件的;
# ls -l | grep '^...s..s'
上面的命令是用来查找suid和guid的。


运维网声明 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-19471-1-1.html 上篇帖子: Linux下手动启动服务的方法 下篇帖子: Linux的环境变量以及 set env export的区别 表达式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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