标签:正则表达式
一、作业(练习)内容:
1、总结本此课程中所涉及命令的使用方法及相关示例展示;
2、总结基本正则表达式及扩展正则表达式
3、显示/etc/passwd文件中以bash结尾的行
4、显示/etc/passwd文件中的两位数或三位数
5、显示`netstat -tan`命令结果中以‘LISTEN’后跟0个、1个或者多个空白字符结尾的行
6、添加用户bash、testbash、basher以及nologin用户(nologin用户的shell为/sbin/nologin);而后找出/etc/passwd文件中用户名与其shell名相同的行
7、显示当前系统上root、centos或者user1用户的默认shell和UID (请事先创建这些用户,若不存在)
8、找出/etc/rc.d/init.d/functions文件中某单词(单词中间可以存在下划线)后面跟着一组小括号的行
9、使用echo输出一个路径,而后egrep找出其路径基名;进一步的使用egrep取出其目录名
10、找出ifconfig命令执行结果中1-255之间的数字
第一、二题:看笔记(正在补)
第三题:使用$锚定bash为词尾
[root@ST_server home]# grep "bash$" /etc/passwd root:x:0:0:root:/root:/bin/bash nginx:x:498:498::/home/nginx:/bin/bash mysql:x:500:500::/home/mysql:/bin/bash huangyisan:x:502:502::/home/huangyisan:/bin/bash huangyisan1:x:503:503::/home/huangyisan1:/bin/bash huangyisan2:x:504:502::/home/huangyisan2:/bin/bash huangyisan3:x:505:505::/home/huangyisan3:/bin/bash
第四题:第一位设定为[1,9]然后第二位和第三位为[0,9],并且让他们出现一次(因为已经有了最高位了)所以第二位其实是出现1次或者2次,然后用-o将需要匹配的对象给抠出来。
[root@ST_server home]# grep -o "\<[1-9][0-9]\{1,2\}\>" /etc/passwd_bak
最后显示的结果没有把"07"给匹配进去,因为07属于一位数。这道题目要注意的是首位数字不能为0
[root@ST_server home]# cat /etc/passwd_bak | grep 07 halt:x:07:0:halt:/sbin:/sbin/halt [root@ST_server home]# grep -o "\<[1-9][0-9]\{1,2\}\>" /etc/passwd_bak | grep 07 [root@ST_server home]#
第五题:0,1个或者多个,那么是前一个字符的多次匹配,可以使用*,或者使用{0,\},然后他要求是空白字符结尾的行,空白字符可以用[:space:]表示,结尾的行则使用行尾锚定$
[root@ST_server home]# cat aa.txt Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 192.168.91.130:4506 192.168.91.131:54854 ESTABLISHED tcp 0 0 :::8080 :::* LISTEN tcp 0 0 ::1:53 :::* LISTEN tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTENING1 tcp 0 0 :::8009 :::* LISTENING
编辑了一个aa.txt写了个干扰项。
[root@ST_server home]# cat aa.txt | egrep "LISTEN[[:space:]]{0,}$" tcp 0 0 :::8080 :::* LISTEN tcp 0 0 ::1:53 :::* LISTEN [root@ST_server home]# cat aa.txt | egrep "LISTEN[[:space:]]*$" tcp 0 0 :::8080 :::* LISTEN tcp 0 0 ::1:53 :::* LISTEN
最终抓出了LISTEN的项目,其实这个LISTEN后面还有空格符的。
第六题:passwd分布第一部分是用户名,用^来锚定,最后一个部分是shell模式,用$来锚定,他说要用户名和shell模式相同,先把用户名给抓出来,用\<用户名\>,然后使用\1来匹配,把用户名参数传入到\1中。
[root@ST_server home]# grep -E "^(\<[[:alnum:]]+)\>.+\1$" /etc/passwd sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt bash:x:606:606::/home/bash:/bin/bash nologin:x:609:609::/home/nologin:/sbin/nologin
[[:alnum:]]包含了字母和数字。
第七题:三个用户采用或关系,首先想"|"符号,通过passwd提取,第一部分为用户名,首行锚定这三个用户。
[root@ST_server home]# grep -E "^(\<root\>|\<centos\>|\<user1\>)" /etc/passwd root:x:0:0:root:/root:/bin/bash centos:x:611:611::/home/centos:/bin/bash user1:x:612:612::/home/user1:/bin/bash
第八题:我的写法存在问题。无法对相隔多个单词之间的下划线进行匹配,这样虽然可以匹配出来,但是并没用上语句的逻辑。
grep -E "\<[[:alpha:]]+_?[[:alpha:]].*\(\)" /etc/rc.d/init.d/functions
第九题:可能echo出现的路径最后会存在/,我的手法是提取两次。先把基名/提取出来,然后再一次提取基名。
[root@ST_server home]# echo /root/data/ | egrep -o "[[:alnum:]]+/?$" | egrep -o "[[:alnum:]]+" data
提取目录,如果只有二级目录可以通过锚定抓取 然后再次抓取[[:alnum:]],多级目录还没考虑出来。
第十题:分成五个段,个位段;十位段,100-199段,200-249段,250-255段
[root@ST_server home]# ifconfig | egrep "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
还有点问题,比如mac地址内的数字没有被抓取出来。
扩展:抓取ifconfig的ip地址。特点是第一个不能为0 范围是1-255 第二个到第四个可以为0,范围是0-255。
[root@ST_server home]# ifconfig |egrep -o "(\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.)(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){2}(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>)" 192.168.130.131 192.168.130.255 255.255.255.0 127.0.0.1 255.0.0.0
标签:正则表达式
原文地址:http://huangyisan.blog.51cto.com/6925110/1689511