一、作业(练习)内容:

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之间的数字


第一、二题

http://huangyisan.blog.51cto.com/6925110/1690105

http://huangyisan.blog.51cto.com/6925110/1690110



第三题:使用$锚定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 init.d]# echo "/etc/sysconfig/networks-sysconfig/" |   egrep  -o "^(/[^/]+){1,}" | egrep -o "[^/]+$"
networks-sysconfig

提取基名的目录名:

[root@ST_server ~]# echo "/etc/sysconfig/networks-sysconfig/cis00co/h3c_009/update/mv/" |   egrep  -o "^(/[^/]+){1,}" | egrep -o "^/([^/]+/){1,}" | egrep -o "[^/]+/?$" | egrep -o "[^/]+"
update

wKioL1Xh2kmAwPk0AAFe1rcqVS8493.jpg

第十题:分成五个段,个位段;十位段,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])\>"

wKioL1XgimTx5PjCAAHHzsHS2iA054.jpg

还有点问题,比如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