大家好,今天小编来为大家解答以下的问题,关于Linux中查找文件内容和字符串的grep和egrep的区别,这个很多人还不知道,现在让我们一起来看看吧!
grep 的工作方式是在一个或多个文件中搜索字符串模板。如果模板包含空格,则必须用引号引起来,并且模板后面的所有字符串都将被视为文件名。搜索结果发送到屏幕,不影响原始文件内容。
grep 可以在shell 脚本中使用,因为grep 通过返回一个状态值来指示搜索的状态,如果模板搜索成功则为0,如果搜索不成功则为1,如果搜索的文件不存在则为2。我们可以利用这些返回值来执行一些自动化的文本处理工作。
除了grep 之外,还有以下文本搜索工具:
egrep(扩展grep)egrep是grep的扩展,支持更多的re正则表达式元字符,相当于grep -E。
fgrep(固定grep)是固定grep或快速grep。他们将所有字母视为单词。也就是说,正则表达式中的元字符代表它们自己的字面意义,不再特殊。相当于grep -F ,与grep和egrep相比执行速度最快。
使用这些工具时,我们需要具备一些基本的shell技能并熟悉正则表达式:
正则表达式,又称为正则表达式、正则表达式(英文:Regular Expression,代码中常缩写为regex、regexp或RE),是计算机科学中的一个概念。正则表达式使用单个字符串来描述和匹配一系列符合某种语法规则的字符串。在许多文本编辑器中,正则表达式通常用于检索和替换与特定模式匹配的文本。
所谓元字符是指正则表达式中那些具有特殊含义的特殊字符,可以用来指定其前导字符(即元字符前面的字符)在目标对象中的出现模式。
转义字符是指示字符序列中出现在其之后的后续字符的替代解释的字符。转义字符是元字符(en:metacharacter) 的一种特殊情况。一般来说,判断一个字符是否是转义字符是根据上下文来确定的。转义字符是标记转义序列开始的字符。
转义字符的英文名称是Escape character。原指ASCII中十进制27、十六进制1D、八进制033定义的字符。对应标准键盘左上角的ESC键。如果旧键盘没有ESC 键,则替代输入是“Ctrl+[”。在旧的计算机外设控制协议中,ASCII码中十进制27字符开始的字符序列是外设的控制序列,不能根据这些字符的字面含义来解释。后来转义符原来的狭义含义被扩展。在各种计算机语言和协议中,标记转义序列开始的字符称为转义字符。最常见的例子之一是,在C编程语言中,使用反斜杠字符“\”作为转义字符来表示那些不可打印的ASCII控制字符。在URI协议中,转义字符是百分号“%”。
grep和egrep详解
2. grep命令选项
-?
同时显示上方和下方的匹配线?行,如:grep -2pattern filename 同时显示匹配行的上下两行。
-b, –字节偏移量
在打印匹配行之前先打印匹配行所在的块号。
-c,–计数
只打印匹配的行数,不显示匹配的内容。
-f 文件,–file=文件
从文件中提取模板。空文件包含0 个模板,因此没有任何匹配项。
-h, –无文件名
搜索多个文件时,不会显示匹配的文件名前缀。
-i, –忽略大小写
忽略大小写差异。
-q,–安静
取消显示并仅返回退出状态。 0 表示找到匹配的行。
-l, –带匹配的文件
打印与模板匹配的文件列表。
-L, –文件不匹配
打印与模板不匹配的文件列表。
-n, –行号
在匹配行之前打印行号。
-s,–沉默
不显示有关不存在或无法读取的文件的错误消息。
-v, –恢复匹配
反检索,只显示不匹配的行。
-w, –word-正则表达式
如果用\ 引用,则表达式将作为单词进行搜索。
-V,–版本
显示软件版本信息。
3. grep实际案例
格式: grep [选项] 模式文件名注意,如果: 模式是一个表达式或两个以上的单词,则需要用引号引起来。它可以是单引号或双引号。不同之处在于单引号不能引用变量,但双引号可以。
想要用好grep工具,其实需要写好正则表达式。因此,我不会在这里举例说明grep的所有功能。我只举几个例子来解释如何编写正则表达式。
[root@zcwyou ~]# ls -l | grep ‘^a’ 通过管道过滤ls -l 的输出,仅显示以a 开头的行。
[root@zcwyou ~]# grep ‘test’ d\*显示以d 开头的所有文件中包含test 的行。
[root@zcwyou ~]# grep ‘test’ aa bb cc 显示aa、bb、cc 文件中与test 匹配的行。
[root@zcwyou ~]# grep ‘[a-z]\{5\}’ aa 显示包含每个字符串中至少有5 个连续小写字符的字符串的所有行。
[root@zcwyou ~]# grep ‘w\(es\)t.*\1’ aa如果匹配到west,则将es存入内存并标记为1,然后搜索任意个字符(.),这些字符后面跟着另一个es (\1),找到该行后就会显示该行。如果使用egrep或者grep -E,则不需要用’\’符号进行转义,直接写成’w(es)t.\1’即可。
使用grep 查找待处理的文本内容
参数说明:
-I:忽略大小写
-c:打印匹配行数
-l :从多个文件中查找包含匹配项
-v :查找不包含匹配项的行
-n:打印包含匹配项和行标识符RE(正则表达式)符号的行
\ 忽略正则表达式中特殊字符的原始含义
^ 匹配正则表达式的起始行
这个乳胶配方:无法识别。正则表达式匹配的结束行从正则表达式匹配的行开始,到正则表达式匹配的行结束[ ] 单个字符;如[A]即A满足要求[-]范围;如[A-Z]即A、B、C到Z均符合要求。所有单个字符,所有字符,长度可以是03.1。只查看wget进程““bash[root@zcwyou ~]# ps -ef | grep wget““ 3.2 查找以root 开头的行““bash[root@zcwyou ~]# grep ‘^root’ /etc/group““3.3 查找包含http“`bash[root@ 的行zcwyou ~]# grep ‘http ‘/etc/group“`3.4 查找以root 结尾的行“`bash[root@zcwyou ~]# grep ‘root/etc/group“`3.5 查找包含abc 的行zcwyou.txt““ bash[root@zcwyou ~]# grep ‘\abc\’ zcwyou.txt“`或“`bash[root@zcwyou ~]# grep ‘abc’ zcwyou.txt“`3.6查找以abc` “bash[root@zcwyou ~]# grep ‘^abc’ zcwyou.txt““3.7 查找以.bak 结尾的行。注意转义符号“`bash[root@zcwyou ~]# grep ‘\.bakfile containslines都以.bak开头“`3.8查找包含poly或Poly的单词的行“`bash[root@zcwyou ~] # grep ‘[Pp]oly’ zcwyou.txt“`3.9 查找至少包含一个大写字母的行“`bash[root@zcwyou ~]# grep ‘[A-Z]’ zcwyou.txt““3.10查找至少包含一个数字的行“`bash[root@zcwyou ~]# grep ‘[0 -9]’ zcwyou.txt“`3.11 查找包含五个字符的行,以大写字母开头,以数字结尾.“bash[root@zcwyou ~]# grep ‘[A-Z].[0- 9]’ zcwyou.txt“`3.12 查找包含单词test 或Test 的行。“`bash[root@zcwyou ~ ]# grep -w ‘[tT]est’ zcwyou.txt“`3.13 查找包含胡椒猪的行,但不打印该行,而是用于检查退出状态“`bash[root@zcwyou ~ ]# grep -s ‘pepper pig’ zcwyou.txt“`3.14 打印文件内容但排除aaa OK。 “`bash[root@zcwyou ~]# grep -v aaa file“`3.15 查找包含abc 的行,无论大小写“`bash[root@zcwyou ~]# grep -i abc zcwyou.txt“ `3.16打印包含pepper pig的文件内容和文件名列表“`bash[root@zcwyou ~]# grep -l ‘pepper pig’ \*“`3.17 找到zcwyou.txt中包含ftp内容的行,并添加行号。
“`bash[root@zcwyou ~]# grep -n ftp zcwyou.txt “`12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin3.18 找到包含变量内容的行。注意必须使用双引号,单引号不能引用变量。“`bash[root@zcwyou ~]# grep ‘$LOGNAME’ zcwyou.txt “`3.19 查找包含字符$name的行“`bash[root @zcwyou ~]# grep ‘$name’ zcwyou .txt“`4. egrep 用例egrep=grep -E 除了基本正则表达式之外,您还可以使用扩展表达式。注意区别。扩展表达式: 匹配一个或多个前一个字符,至少一个前一个字符.匹配0 个或多个前面的字符。 a|b|c 匹配a或b或c()字符组,如: love(able|ers)匹配loveable或lovers.(.)(.)\1 \2模板匹配。 \1 代表前面第一个模板,\2 代表第二个括号里的模板。 x{m,n}=x{m,n} x 的字符数在m 和n 之间。 4.1 打印以一个或多个空格开头的行““bash[root@zcwyou ~]# egrep ‘^+’ zcwyou.txt“` 或““bash[root@zcwyou ~]# grep ‘^*’ zcwyou.txt“`4.2 查找包含TOM SAVAGE 和DAN SAVAGE 的行“`bash[root@zcwyou ~]# egrep ‘(TOM|DAN) SAVAGE’ zcwyou.txt“`4.3 查找包含至少一个ab ` 的行“bash[root@zcwyou ~]# egrep ‘(ab)+’ zcwyou.txt“`4.4 查找包含x 或x 后跟0 个或多个数字的行“`bash[root@zcwyou ~]# egrep ‘x [0-9]? zcwyou.txt“4.5 查找以fun 结尾的行。在所有文件中。“`bash[root@zcwyou ~]# egrep ‘fun\.*“`4.6 查找至少包含一个大写字母的行。“`bash[root@zcwyou ~]# egrep ‘[A-Z ]+’ zcwyou.txt“`4.7 查找至少包含一个数字的行。“`bash[root@zcwyou ~ ]# egrep ‘[0-9]’ zcwyou.txt“`4.8 查找包含五个字符的行,第一个大写,最后一个是数字“`bash[root@zcwyou ~]# egrep ‘[ A-Z].[0-9]’ zcwyou.txt“`4.9 查找包含以下内容的行单词test 或Test。“bash[root@zcwyou ~]# egrep ‘[tT]est’ zcwyou.txt“ `4.10 查找包含abc 123 的行。“bash[root@zcwyou ~]# egrep ‘ abc 123’ zcwyou.txt“`4.11 查找不包含Marry 的行。“bash[root@zcwyou ~]# egrep -v ‘marry’ zcwyou.txt“`4.12 忽略大小写,搜索包含jack 的行““bash[root@zcwyou ~]# egrep -i ‘jack’ zcwyou.txt““4.13 搜索包含abc 123 的行所有文件列表“`bash[root@zcwyou ~]# egrep -l ‘abc 123’ * “`4.14 包含tom的行,在每行前面追加行号“`bash[root@zcwyou ~]# egrep -n pack zcwyou.txt“`4.15 查找变量名的内容$name,不打印,但显示退出状态。“bash[root@zcwyou ~]# egrep -s ‘$name’ zcwyou.txt“ 0 表示找到。 1表示未找到符合要求的表达式,2表示未找到文件。 5. 正则表达式5.1 grep 正则表达式元字符集(基本集) ^锚定行的开头如:’^grep’ 匹配以grep 开头的所有行。锚行结尾例如:’grep 匹配所有以grep 结尾的行。
匹配非换行符,例如:’gr.p’ 匹配gr 后跟任意字符,然后是p。
匹配零个或多个先前的字符。例如: ‘*grep’ 匹配所有带有一个或多个空格的行,后跟grep。* 一起使用代表任意字符。 []
匹配指定范围的字符,如'[Gg]rep’匹配Grep和grep。
[^]
匹配不在指定范围内的字符,例如:'[^A-FH-Z]rep’ 匹配以不包含A-R 和T-Z 的字母开头的行,后跟rep。
(.)
标记匹配字符,如'(love)’,love标记为1。
锚定单词的开头,如: ‘grep’ 匹配包含以grep 开头的单词的行。
\
锚定单词的结尾,例如’grep\’ 匹配包含以grep 结尾的单词的行。
x{米}
重复字符x, m 次,例如:’0{5}’ 匹配包含5 个o 的行。
x{米,}
重复字符x 至少m 次,例如: ‘o{5,}’ 匹配包含至少5 个o 的行。
x{m,n}
重复字符x 至少m 次且不超过n 次。例如: ‘o{5,10}’ 匹配包含5-10 o 的行。
\w
匹配文字和数字字符,即[A-Za-z0-9],例如:’G\w*p’ 匹配G 后跟零个或多个文字或数字字符,然后是p。
\W
\w 的倒置形式,匹配一个或多个非单词字符,例如句点、句点等。
\b
字锁定字符,例如: ‘\bgrep\b’ 仅匹配grep。
5.2 egrep 和grep -E 的元字符扩展
+
匹配一个或多个前面的字符。例如:'[a-z]+able’,匹配一串由一个或多个小写字母组成的字符串,后接able,如loveable、enable、disable等。
?
匹配零个或多个先前的字符。例如: ‘gr?p’ 匹配gr 后跟一个字符或没有字符,然后是p 的行。
a|b|c
匹配a 或b 或c。例如:grep|sed 匹配grep 或sed
()
分组符号,如:love(able|rs)ov+ 匹配loveable或lovers,匹配一个或多个ov。
x{m},x{m,},x{m,n}
函数与x{m},x{m,},x{m,n} 相同
5.3 POSIX 字符类
为了保持不同国家的字符编码的一致性,POSIX(可移植操作系统接口)添加了特殊的字符类,例如[:alnum:],这是A-Za-z0-9的另一种写法。它们必须放在[] 符号内才能成为正则表达式,例如[A- Za-z0-9] 或[[:alnum:]]。除了fgrep 之外,Linux 下的grep 支持POSIX 字符类。
grep 和egrep 字符类
[:alnum:]
字母数字字符
[:alpha:]
文字字符
[:数字:]
数字字符
[:图:]
非空字符(非空格、控制字符)
[:下:]
小写字符
[:cntrl:]
控制字符
[:打印:]
非空字符(包括空格)
[:punct:]
标点
[:空间:]
所有空白字符(换行符、空格、制表符)
[:上:]
大写字符
[:x数字:]
十六进制数字(0-9、a-f、A-F)
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/197684.html
用户评论
青山暮雪
终于找到了详细解释grep和egrep区别的文章!一直觉得这俩命令很像,但具体使用方法好像总是记混了,这篇博客写的太棒了!这下子我总算理解了
有13位网友表示赞同!
蹂躏少女
说的对,grep和 egrep 经常让人分不清来区别。不过这篇文章里用实例讲解的很清楚,尤其是关于正则表达式这点,让我受益匪浅。
有12位网友表示赞同!
那伤。眞美
我也是在找linux下查找文件内容时才明白grep和egrep的区别,以前都乱用…现在学习了一点点grep的基本用法,但egrep的正则表达式的部分还没完全掌握呢。这篇文章刚好填补了我的问题
有14位网友表示赞同!
娇眉恨
标题点明主题太棒了!看了这篇文章我豁然开朗了,原来grep和egrep的区别就在于正则表达式匹配的功能啊。看来以后学习Linux的时候还是要多总结笔记,把知识点牢记在心
有20位网友表示赞同!
微信名字
对grep基本功还是挺熟悉的,但是egrep的用法确实不熟练。这篇博客图文并茂,很直观易懂,让我对 egrep 更加了解了!
有12位网友表示赞同!
作业是老师的私生子
我平时工作的时候,经常需要在代码中查找特定的字符串。这篇文章介绍的 grep 和 egrep 的使用方法,对我来说很有用!
有9位网友表示赞同!
命运不堪浮华
感觉这篇博文解释得很清晰,但对于初学者来说,正则表达式还是要多练习才能熟练掌握
有5位网友表示赞同!
走过海棠暮
确实,grep命令本身就太强大了吧!虽然学习了一段时间linux,但我到现在才发现egrep的存在。这篇文章很有实用价值,谢谢分享!
有16位网友表示赞同!
无关风月
感觉grep和egrep的用法并没有想象中那么复杂,尤其是当掌握了正则表达式之后,就可以轻松完成各种文件查找任务
有5位网友表示赞同!
剑已封鞘
以前用 grep 和 egrep 用的不太多, 现在看到这篇文章感觉有必要学习一下。毕竟在处理大量文件的时候,这两个命令确实非常有用!
有7位网友表示赞同!
站上冰箱当高冷
文章写的很棒,图文并茂,讲解也很详细。我现在对 grep 和 egrep 的使用方法有了更深入的理解。
有5位网友表示赞同!
敬情
这篇博客虽然解释得很清楚了,但我还是觉得正则表达式有点复杂啊…也许我需要花时间多练习一下才能真正掌握.
有7位网友表示赞同!
西瓜贩子
我一直以为grep和egrep的区别只是在语法上,没想到还有这么多细节。这篇文章让我对这两个命令有了全新的认识!
有12位网友表示赞同!
不要冷战i
感觉这篇博文挺有用,但是有些地方解释的太过于专业了,可能让没有 Linux 基础的人比较难以理解。
有7位网友表示赞同!
爱到伤肺i
我觉得正则表达式确实很难学,尤其是在grep和egrep中运用起来。这篇文章写的虽然很好,但我还是需要多练习才能熟练掌握.
有5位网友表示赞同!
ゞ香草可樂ゞ草莓布丁
作者说的不错,grep 和 egrep 这两个命令都是 Linux 的必备工具,掌握它们可以大大提高工作效率!
有14位网友表示赞同!
三年约
我一直在使用 grep 和 egrep ,但这次读了这篇文章之后,感觉自己还是有很多不足的地方。看来我还需要多学习和实践
有5位网友表示赞同!
虚伪了的真心
以前就觉得grep 和 egrep 这些命令太复杂,看着那些怪异的正则表达式头疼不已。这篇博文讲解得很清楚,至少让我明白了它们的用途!
有8位网友表示赞同!