首页 > 代码库 > Grep 和 Egrep 使用细解

Grep 和 Egrep 使用细解

Grep 想说爱你不容易j_0020.gif


grep: 

         Global search REgular expression and Print out the line

        文本搜索工具:根据用户指定的“模式(pattern)”对目标文本进行过滤,显示被模式匹配到的行。


用法:grep [OPTION]... ‘PATTERN‘ FILE...

grep--color   自动执行着色


正则表达式:是由一类字符书写的模式,其中有些字符不表示字符的字面意义,而是表示控制或通配的功能;


两种类型的元字符

  • 基本正则表达式

  • 扩展正则表达式 


基本正则表达式:

 字符匹配:

  •   .   匹配任意单个字符

  • []    匹配指定集合中的任意单个字符

  • [[:digit:]], [0-9] 匹配指定集合中的单个数字

  • [[:lower:]], [a-z] 匹配指定集合中的单个小写字母

  • [[:upper:]], [A-Z] 匹配指定集合中的单个大写字母

  • [[:alpha:]], [a-zA-Z] 匹配指定集合中的单个大写或小写字母

  • [[:alnum:]], [0-9a-zA-Z] 匹配指定集合中的单个数字或小写字母或大写字母

  • [[:space:]] 匹配指定集合中的空白格

  • [[:punct:]] 匹配指定集合中的标点符号

  • [^]   匹配指定集合外的任意单个字符


匹配次数:用于对其前面紧邻的字符所能够出现的次数作出限定

  • *      匹配其前面的字符任意次,0,1或多次;

  • \?     匹配其前面的字符0次或1次;

  • \+     匹配其前面的字符出现至少1次;

  • \{m\}  匹配其前面的字符m次;

  • \{m,n\}匹配其前面的字符至少m次,至多n次;

  • .*     匹配任意长度的任意字符


位置锚定:

  •    ^        行首锚定    写在模式的最左侧

  •     $       行尾锚定    写在模式的最右侧

  •    ^$       空白行

  •    \<       词首锚定, \b   出现在要查找的单词模式的左侧;\<char

  •    \>       词尾锚定, \b   出现在要查找的单词模式的右侧;char\>

  • \<pattern\> 匹配单词


分组:\(\) 

后向引用:模式中,如果使用\(\)实现了分组,在某行文本的检查中,如果\(\)的模式匹配到了某内容,此内容后面的模式中可以被引用

\1, \2, \3

模式自左而右,引用第#个左括号以及与其匹配右括号之间的模式匹配到的内容


grep选项

  • -v   反向选取,匹配到的不显示,不匹配到的显示

  • -o   仅显示匹配到内容

  • -i   忽略字符大小写

  • -E   使用扩展正则表达式

  • -A # 显示匹配到的行包括下面的#

  • -B # 显示匹配到的行包括前面的#

  • -C # 显示匹配到的行包括上下的#


举例练习:

1、显示/proc/meminfo文件中以大写或小写S开头的行;

wKiom1RoU9PTZug0AADYEiNjVHc143.jpg

2、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;

wKioL1RoWdXz4pSAAAI4V_4vMO0044.jpg

注:匹配单词取反时,必须使用-v选项。

    \<\>只锚定数字和字母

3、显示/etc/passwd文件中其默认shell为/bin/bash的用户;进一步:仅显示上述结果中其ID号最大的用户;

wKiom1RoX6qC9_r4AAGg07qqb0k120.jpg

而后显示最大的用户

wKiom1RoX_vAToOaAAByWeg2DlM934.jpg

4、找出/etc/passwd文件中的一位数或两位数;

wKiom1RoYdfhs3vTAAH8rMYA8KY687.jpg

注:‘|’或者符仅用于egrep的模式中,在grep模式中则使用‘\|’转译该符号


5、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;

wKiom1RoZACwCtlBAAGa0taDE4E870.jpg

6、显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;

wKioL1RoZgjz21e5AAGS20WG5hU105.jpg


7、找出netstat -tan命令执行结果中以‘LISTEN‘(后可有空白字符)结尾的行;

wKiom1RoZhyAboSKAAFksXp2swI266.jpg



Egrep  扩展的正则表达式

用法:

     # grep -E ‘pattern‘ file...

     # egrep ‘pattern‘ file...

注:“#”在命令行使用的命令格式


扩展正则表达式的元字符:

字符匹配:

  •  .  匹配任意单个字符

  • []  匹配指定集合内的单个字符 

  • [^] 取反,匹配指定集合外的任意单个字符


匹配次数限定:

  • *    匹配其前面字符次,次,多 

  • ?    匹配其前面字符0次或1次;

  • +    匹配其前面的字符至少1次;

  • {m}  匹配其前面的字符 次;

  • {m,n}匹配其前面字符至少m次-->{m,};至多n次-->{0,n}


锚定:

  • ^  锚定行首

  • $  锚定行尾

  • \< 锚定词首

  • \> 锚定词尾  或使用 \b


分组:

  • ()使用时无需\支持后向引用:\1, \2, ...


或者:

  •     a|b    匹配a或者b

  •     ab|cd  匹配整个左侧或右侧


举例

练习1:显示当前系统上root、centos或user1用户的默认shell及用户名;

wKiom1RoazSwz7fiAAFHJGfeJDs931.jpg

练习2:找出/etc/rc.d/init.d/functions文件中某单词后面跟一对小括号"()"的行;

wKiom1RobNPCdpBMAADkl_XVKKI040.jpg

练习3:使用echo输出一个路径,而使用egrep取出其基名;

wKiom1RocdfRrawXAACex8KGioQ252.jpg

注意:此题查找的路径中带符号,固使用命令时要思考清楚自己想搜索的路径结果


fgrep  fast grep 基于快速搜索


用法fgrep [option] ‘string‘ file...

注:该命令不支持正则表达式,搜索时仅搜索字面字符,基于快速搜索

wKioL1RodEnBv9PwAACaO4SdNhc562.jpg


本文出自 “保持低调” 博客,请务必保留此出处http://664778789.blog.51cto.com/7534952/1577162

Grep 和 Egrep 使用细解