grepegrep区别grep默认不支持扩展,但是可以使用-E选项支持扩展正则egrep支持扩展正则。正则和扩展正则的区别可以看我的另一个shell正则介绍文件处理顺序是逐行处理,默认只输出符合表达式的文本行。基本用法-格式一:egrep[select]'正则表达式'文件-格式二:前置命令|egrep[select]'正则表达式'?egrep命令工具(扩展正则命令)?常用命令选项-E,grep支持扩展正则egrep不需要-v,否定匹配-i,忽略大小写-c,计算匹配行-q,silent输出,无任何输出,一般用于检测-n,显示匹配结果的行号--color,标记红色显示匹配字符串-w精确匹配-m匹配指定的前n行grep正则表达式,用于查找过滤文档的工具符号grep"root"user//在用户文档中查找root字样的行grep"^root"user//在用户文档中查找以root字样开头的行grep"bash$"user//在用户文件中查找以单词bash结尾的行grep"^$"user//查找空行grep"^"user//查找以空格开头的行grep"[rot]"user//findlettersroroortgrep"roo[tn]"user//查找root或roongrep"1"user//查找字母r或o或t以外的内容grep"[a-z]"user//查找小写字母grep"[A-Z]"user//查找大写字母grep"[a-Z]"user//查找所有字母grep"[0-9]"user//查找数字grep"r..t"user//查找以开头的两个字符r和以t结尾的带有任意字符的单词grep"r."user//查找任何以r开头的字符,相当于一个通配符grep"ro*"user//查找以r开头的带或不带字母o的单词,o可以出现任意次数grep"o{1,2}"user//查找o出现1到2次的行grep"o{2,3}"user//查找o出现2到3次的行grep"o{2}"user//查找o出现2次的行grep"o{1,}"user//查找o出现1次及以上的行grep"(:0){2}"user//Find:0(NumberZero)连续出现两次并扩展常规egrep"o+"user//Findo出现一次或多次egrep"o?"user//查找o出现0次或1次egrep"o{1,2}"user//查找o出现1到2次的行egrep"o{2,3}"user//查找o出现2到3次的行lineegrep"o{2}"user//找到o出现2次的行egrep"o{1,}"user//找到o出现1次或更多次的行egrep"(:0){2}"user//查找:0(数字零)连续出现两次egrep"bash|nologin"user//查找bash或nologinegrep"\bthe\b"a//查找单词the,前后有空格或特殊符号案例:正则表达式匹配练习1)典型应用场合:grep和egrep搜索文本行grep命令没有-E选项时,支持基本的正则匹配方式,如“word”关键字搜索,“^word”匹配行以单词开头,“word$”匹配以单词结尾的行...等。输出以“r”开头的用户记录:[root@case100~]#grep'^r'/etc/passwdroot:x:0:0:root:/root:/bin/b输出以“localhost”结尾的行:[root@case100~]#grep'localhost$'/etc/hosts127.0.0.1localhostlocalhost如果想在grep查询中同时组合多个条件,比如输出以“root”或“”开头的行daemon":[root@case100~]#grep'^root|^daemon'/etc/passwd//没有搜索结果[root@case100~]#如果使用grep-E或者egrep命令,可以支持扩展正则匹配模式,可以自动识别扩展正则表达式中的|、{}等特殊字符,使用起来更方便,例如:[root@case100~]#egrep'^root|^daemon'/etc/passwdroot:x:0:0:root:/root:/bin/bashdaemon:x:2:2:daemon:/sbin:/sbin/nologin或[root@case100~]#egrep'^(root|daemon)'/etc/passwdroot:x:0:0:root:/root:/bin/bashdaemon:x:2:2:daemon:/sbin:/sbin/nologin使用grep-E完全等同于使用egrep命令,推荐后者,尤其是当涉及到复杂的正则表达式的时候。2)grep和egrep命令的-q选项选项-q表示安静(quiet)。结合这个选项,可以只搜索不输出。通常在脚本中用于识别搜索目标是否存在。通过返回状态$?判断一下,这样可以忽略不相关的文本信息,简化脚本输出。例如查看/etc/hosts文件中是否有192.168.4.4的映射记录。如果存在则显示“YES”,否则输出“NO”。一般会执行:[root@case100~]#grep'^192.168.4.4'/etc/hosts&&echo"YES"||echo"NO"192.168.4.4case100.tarena.comcase100YESgrep的输出信息和脚本判断后的提示混合在一起,用户很难区分,可以改为如下操作:[root@case100~]#grep-q'^192.168.4.4'/etc/hosts&&echo"YES"||echo"NO"YES并没有多爽快,从上面的结果可以看出,使用-q选项的效果和使用&>/dev/null差不多。3)基本元字符^、$——匹配行首尾输出注释配置行(#开头的行):[root@case100~]#egrep'^#'/etc/inittabstatisticslocaluserlogin的shell为“/sbin/nologin”的用户数:提示:-m10只过滤文件的前10行,不过滤后面的行。[root@case100~]#egrep-m10'/sbin/nologin$'/etc/passwd//首先确认匹配正确bin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinmail:x:8:12:mail:/var/spool/mail:/sbin/nologinuucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologingopher:x:13:30:gopher:/var/gopher:/sbin/nologinftp:x:14:50:FTPUser:/var/ftp:/sbin/nologin结合-c选项输出匹配行数[root@case100~]#egrep-c'/sbin/nologin$'/etc/passwd32使用-c选项来输出匹配的行数,这和wc-l通过管道的效果是一样的,只是写法更简单。例如统计使用“/bin/bash”作为登录shell的普通用户数,可以执行:[root@case100~]#egrep-c'/bin/bash$'/etc/passwd26or[root@case100~]#egrep'/bin/bash$'/etc/passwd|wc-l264)基本元字符。——匹配任意单个字符以/etc/rc.local文件为例,确认文本内容:[root@case100~]#cat/etc/rc.local#!/bin/sh##这个脚本会是*在*所有其他初始化脚本之后执行。#如果你不想,你可以把你自己的初始化东西放在这里#想做完整的SysV风格的初始化东西。touch/var/lock/subsys/local输出一行/etc/rc.local文件至少包含一个字符(\n换行符除外),即非空行:[root@case100~]#egrep'.'/etc/rc.local#!/bin/sh##这个脚本将在*所有其他初始化脚本之后执行。#如果你不想做的话,你可以把你自己的初始化东西放在这里##想做完整的SysV风格的初始化东西。touch/var/lock/subsys/local在/etc/rc.local文件中输出一个空行(使用–v选项反转条件):[root@case100~]#egrep-v'.'/etc/rc.local[root@case100~]#上面取空行的操作和下面的操作效果一样:[root@case100~]#egrep'^$'/etc/rc.local[root@case100~]#5)基本元字符+,?,*——在/etc/rc.loca中返回目标出现的次数l文件为例:[root@case100~]#cat/etc/rc.local#!/bin/sh##这个脚本将在*所有其他初始化脚本之后执行。#你可以把你自己的初始化东西在这里如果你不想做#wanttodothefullSysVstyleinitstuff.touch/var/lock/subsys/localOutputlinesthatincludef,ff,ff,...,i.e."f"occursatleastonce:[root@case100~]#egrep'f+'/etc/rc.local#这个脚本将在*所有其他初始化脚本之后执行。#如果你不想的话,你可以把你自己的初始化东西放在这里#想要做完整的SysV风格的初始化工作。包含init和initial的输出行,即最后的“ial”最多出现一次(可能不出现):[root@case100~]#egrep'init(ial)?'/etc/rc.local#该脚本将在*所有其他初始化脚本之后执行。#如果你不想做完整的SysV风格的初始化东西,你可以把你自己的初始化东西放在这里。输出包括stu,stuf,stuff,stufff,...的行,即最后的“f”可以出现任意次数,也可以没有当repeattarget只有一个字符时,你可以省略括号:[root@case100~]#egrep'stuf*'/etc/rc.local#如果你没有,你可以把你自己的初始化东西放在这里#想做完整的SysV风格的init东西。输出所有行,单个“.*”可以匹配任意行(包括空行):[root@case100~]#egrep'.*'/etc/rc.local#!/bin/sh##这个脚本会是*在*所有其他初始化脚本之后执行。#如果你不想做的话,你可以把你自己的初始化东西放在这里/etc/passwd文件中以“r”结尾,以“nologin”结尾,即中间可以是任意字符:[root@case100~]#egrep'^r.*nologin$'/etc/passwdrpc:x:32:32:PortmapperRPCuser:/:/sbin/nologinrpcuser:x:29:29:RPCServiceUser:/var/lib/nfs:/sbin/nologin6)元字符{}——限制出现次数创建练习用的测试文件:[root@case100~]#vimbrace.txtabdefghiabdrdefababhighhiabcabCD-ROMTARENAITGROUPcdcdabababHelloabababWorld输出包含ababab的行,即“ab”连续出现3次:[root@case100~]#egrep'(ab){3}'brace.txtcdcdabababHelloabababWorld输出行包括abab、ababab、abababab,即“ab”连续出现2~4次:[root@case100~]#egrep'(ab){2,4}'brace.txtdedefababhighicdcdabababHelloababababWorld输出行包括ababab,abababab,...,即"ab"至少连续出现3次:[root@case100~]#egrep'(ab){3,}'brace.txtcdcdabababHelloabababWorld7)元字符[]——匹配范围内的单个字符以前面的测试文件bracet.txt为例:[root@case100~]#catbrace.txtabdefghiabdrdefababhighiabcabCD-ROMTARENAITGROUPcdcdabababHelloababababWorld输出包含abc和abd的行,即前两个字符是“ab”,第三个字符是其中之一c和d。条件:[root@case100~]#egrep'ab[cd]'brace.txtabdefghiabdrabcab光盘输出行包括大写字母,使用[A-Z]匹配连续范围:[root@case100~]#egrep'[A-Z]'brace.txtabcabCD-ROMTARENAITGROUPHelloababababWorld过滤“非小写字母”的其他字符:[root@case100~]#egrep'[^a-z]'brace.txt8)词边界匹配到文件/etc/rc以.local为例:[root@case100~]#cat/etc/rc.local#!/bin/sh##这个脚本将*在*所有其他初始化脚本之后执行。#你可以把你自己的初始化的东西在这里,如果你不想#想做完整的SysV风格的initstuff.touch/var/lock/subsys/local输出行,在文件“initializ”中包含单词“init”ation”不符合要求:[root@case100~]#egrep'\binit\b'/etc/rc.local#这个脚本将在*所有其他初始化脚本之后执行。#想要做完整的SysV风格初始化的东西。或者:[root@case100~]#egrep'\
