grep, egrep, 基本正则表达式及扩展表达式学习及用法
讲grep与egrep之前,我们先要知道grep与egrep是两种文本搜索工具。而文本搜索类工具就是根据用户指定的“模式(pattern)”对目标文本进行过滤,显示被模式匹配到的行。 正则表达式其定义:由一类字符书写的模式,其中有些字符不表示字符的字面意义,而是表示控制或通配的功能;(Global search REgular expression and Print out the line.) 正则表达式分类: 基本正则表达式(grep) 扩展正则表达式(egrep) 正则表达式的语法如下:
grep [OPTION]... 'PATTERN' FILE... --color 基本正则表达式: 字符匹配: .: 匹配任意单个字符: 例如:我先编辑一个a.txt文档,有如下内容: He like his lover. He love his lover. He like his liker. He love his liker. 下面可以自行在XSHELL中练习查找,不在举例 []:匹配指定集合中的任意单个字符 [[:digit:]],[0-9] [[:lower:]],[a-z] [[:upper:]],[A-Z] [[:alpha:]],[a-zA-Z] [[:alnum:]],[0-9a-zA-Z] [[:space:]],所有的空白字符 [[:punct:]],所有标点符号 [^]:匹配指定集合外的任意单个字符
匹配次数:用于对其前面紧邻的字符所能够出现的次数作出限定 *: 匹配其前面的字符任意次,0,1或多次; 例如:用grep搜索'x*y',则会出现:xy,xxy,xxxy,y;xxxy出现说明表达式匹配的贪婪模式,能够尽量多的匹配 ?:匹配其前面的字符0次或1次; 例如:grep 'x?y' xy,y,xxxxxy,aby +: 匹配其前面的字符出现至少1次; {m}: 匹配其前面的字符m次; 例如:grep 'x{2}y' xy,aby {m,n}:匹配其前面的字符至少m次,至多n次; 例如: grep 'x{2,4}y' xy,xxxxxxy,aby grep 'x{0,xxxxxxxxxy,aby grep 'x{2,}y' xy,xxxxxy .*: 匹配任意长度的任意字符 位置锚定: ^: 行首锚定 写在模式的最左侧[[]] $: 行尾锚定 写在模式的最右侧 ^$: 空白行 &;: 词首锚定,或者b 出现在要查找的单词模式的左侧;&;char &;:词尾锚定,或者b 出现在要查找的单词模式的右侧;char&; &;pattern&;: 匹配单词 分组: () 后向引用:模式中,如果使用()实现了分组,在某行文本的检查中,如果()的模式匹配到了某内容,此内容后面的模式中可以被引用; 1,2,3 模式自左而右,引用第#个左括号以及与其匹配右括号之间的模式匹配到的内容; grep选项: -v: 反向选取 -o: 仅显示匹配到内容 -i: 忽略字符大小写 -E: 使用扩展正则表达式=egrep -A #(数字): 匹配到的那行,加上,匹配行后面的第#行也都显示出来;选项加在要匹配内容前后都可以 -B #:匹配到的那行,加上,匹配行前面的第#行也都显示出来;选项加在要匹配内容前后都可以 -C #:匹配行上下#行显示出来;选项加在要匹配内容前后都可以 练习: 1、显示/proc/meminfo文件中以大写或小写S开头的行; grep -i '^s' /proc/meminfo 2、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户; grep -v '/sbin/nologin$' /etc/passwd /etc/passwd 有很多默认shell用户信息等,就是/sbin/nologin$ 类的用户在此目录中 3、显示/etc/passwd文件中其默认shell为/bin/bash的用户; 进一步:仅显示上述结果中其ID号最大的用户; grep '/bin/bash$' /etc/passwd | cut -d':' -f3 | sort -nr | head -1 或:grep '/bin/bash$' /etc/passwd | cut -d':' -f3 | sort -n | tail -1 4、找出/etc/passwd文件中的一位数或两位数; egrep '&;([0-9]|[1-9][0-9])&;' /etc/passwd ;之所以用egrep是因为grep中没有或字符的用法,而egrep中有 | 的用法 或:grep '&;([0-9]{1,2})&;' /etc/passwd 5、显示/boot/grub/grub.conf中以至少一个空白字符开头的行 grep '^[[:space:]]+' /boot/grub/grub.conf 6、显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行; grep '^#[[:space:]]+[^[:space:]]+' /etc/rc.d/rc.sysinit 7、找出netstat -tan命令执行结果中以'LISTEN'(后可有空白字符)结尾的行; netstat -tan | grep 'LISTEN[[:space:]]*$' 8、添加用户bash,testbash,basher,nologin(SHELL为/sbin/nologin),而找出当前系统上其用户名和默认shell相同的用户; useradd -s /sbin/nologin bash 创建其他用户,把后面bash更改一下即可 : useradd(命令) -s(option) /sbin/nologin(option的argument) bash(argument) 解析步骤:id bash(刚添加的用户看是否创建成功) cat /etc/passwd ;先查看一下多少用户、ID、SHELL等信息 egrep '&;^([[:alnum:]]+)&;.*1$' /etc/passwd 或grep '^(&;[[:alnum:]]+&;).*1$' /etc/passwd 9、扩展题:新建一个文本文件,假设有如下内容: He like his lover. He love his lover. He like his liker. He love his liker. 找出其中最后一个单词是由此前某单词加r构成的行。 grep '(&;[[:alpha:]]+&;).*1r' a.txt egrep '(&;[[:alpha:]]+&;).*1r' m.txt egrep及扩展的正则表达式 扩展正则表达式的元字符: 字符匹配: . [] [^] :不匹配 匹配次数限定: * ?: 匹配其前面字符0次或1次; +:匹配其前面的字符至少1次; {m}:匹配其前面的字符m次; {m,n}:{m,},{0,n} 锚定: ^ $ &;,&;: b 分组: () 支持后向引用:1,... 或者: a|b: a或者b ab|cd:ab或者cd grep -E 'pattern' file... 或者:egrep 'pattern' file... 练习10:显示当前系统上root、centos或user1用户的默认shell及用户名; egrep '^(root|centos|user1)' /etc/passwd | cut -d: -f1,7 若用户没有,创建用户 useradd 用户名;如果加错用户名,修改,usermod 正确用户名 错误用户名 练习11:找出/etc/rc.d/init.d/functions文件中某单词后面跟一对小括号"()"的行; grep '&;[[:alpha:]]+&;()' /etc/rc.d/init.d/functions
或egrep '&;[[:alpha:]]+&;()' /etc/rc.d/init.d/functions ; egrep中(转译符号不需要添加,&;,&;除外,所以egrep中的()就等于grep中的(),所以想在egrep中表达(),得转译,+与+同理)
若想切掉后面的},则:egrep '&;[[:alpha:]]+&;()' /etc/rc.d/init.d/functions | cut -d' ' -f1 练习12:使用echo输出一个路径,而使用egrep取出其基名; [root@localhost ~]# echo /etc/passwd/ | egrep -o '&;[[:alpha:]]&;' [root@localhost ~]# echo /etc/passwd/ | egrep -o '&;[[:alpha:]]+&;/$' passwd/(红色/) [root@localhost ~]# echo /etc/passwd/ | egrep -o '&;[^/]+&;/$' | egrep '&;[^/]+>' [root@localhost ~]# echo /etc/passwd/ | egrep -o '&;[^/]+&;/$' | egrep '&;[^/]+&;' passwd/ (白色/) [root@localhost ~]# echo /etc/passwd/ | egrep -o '&;[^/]+&;/$' | egrep -o '&;[^/]+&;' passwd 练习13:找出ifconfig命令结果中的1-255之间的数值; IP的范围:1.0.0.1 - 223.255.255.254 ifconfig | egrep -o '&;([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-1][0-9]|22[0-3])&;.&;([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])&;.&;([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])&;.&;([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])&;' 解析:1-223.0-255.0-255.0-254去匹配,因为限定条件为1-255之间的数值,所以为1-223.1-255.1-255.1-254去匹配 或:ifconfig | egrep -o --color=auto '&;([1-9]|[1-9][0-9]|1[0-9]{2}|21[0-9]|22[0-3])&;.(&;([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])&;.){2}&;([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])&;'
练习14:找出ifconfig命令结果中的IP地址; ifconfig | egrep -o --color=auto '&;([1-9]|[1-9][0-9]|1[0-9]{2}|21[0-9]|22[0-3])&;.(&;([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])&;.){2}&;([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])&;' 解析:因为IP地址的区间为1.0.0.1 - 223.255.255.254,所以按照1-223.0-255.0-255.1-254去匹配 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |