首页 > 代码库 > *7 正则表达式的练习

*7 正则表达式的练习

1.grep/egrep正则表达式练习:

  1) 显示/etc/passwd文件中不以bash结尾的行;


[root@centos-64-72a ~]# grep -v "/bash$" /etc/passwd|wc

     42      88    2237

(基本正则表达式匹配信息,-v选项是不匹配pattern,$符号是代表的是行尾锚定)

[root@centos-64-72a ~]# grep -v "/bash\>" /etc/passwd|wc

     42      88    2237

(基本正则表达式匹配信息,-v选项是不匹配pattern,\>符号是代表的是字尾锚定)

pattern内容需使用“”符号引用起来

以上的pattern因为是在一起可以把它当成字符段,也可以把它当成字符行;


  2) 找出ifconfig命令执行结果中的两位或三位整数;


[root@centos-64-72a ~]# ifconfig|grep "\<[0-9]\{2,3\}\>"|wc

     11      63     631

(基本正则表达式匹配信息,\<,\>符号代表字首与字尾锚定,[0-9]代表数字字符匹配,\{2,3\}代表次数匹配)

[root@centos-64-72a ~]# ifconfig|egrep "\<[0-9]{2,3}\>"|wc

     11      63     631

(扩展正则表达式匹配信息,\<,\>符号代表字首与字尾锚定,[0-9]代表数字字符匹配,{2,3}代表次数匹配,扩展正则表达式可以省略大多数的\符号)


  3) 找出/etc/grub2.cfg(在CentOS6中是/etc/grub.conf)文件中,以空白字符开头的非空白行;


[root@centos-64-72a ~]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg|wc

     64     169    2121

(基本正则表达式匹配信息,^符号是代表的是行首锚定,[[:space:]]\+代表匹配一个空格或多个空格,[^[:space:]]代表匹配非空格)

[root@centos-64-72a ~]# egrep "^[[:space:]]+[^[:space:]]" /etc/grub2.cfg|wc

     64     169    2121

(扩展正则表达式匹配信息,^符号是代表的是行首锚定,[[:space:]]\+代表匹配一个空格或多个空格,[^[:space:]]代表匹配非空格,扩展正则表达式可以省略大多数的\符号)


  4) 找出"netstat -tan”命令的结果中,以"LISTEN"后跟任意个空白字符结尾的行;


[root@centos-64-72a ~]# netstat -tan | grep "LISTEN[[:space:]]*$"|wc

      9      54     720


  5) 找出"fdisk -l“命令的结果中,包含以/dev/后跟sd或hd及一个小写字母的行;


[root@centos-64-72a ~]# fdisk -l | grep "/dev/sd\|hd[a-z]"|wc

      4      28     271

[root@centos-64-72a ~]# fdisk -l | egrep "/dev/sd|hd[a-z]"|wc

      4      28     271

[root@centos-64-72a ~]# fdisk -l | grep "/dev/[sh]d[a-z]"|wc

      4      28     271

(sd\|hd代表sd或hd)


  6) 找出"ldd /usr/bin/vim"命令的结果中所有的文件路径;


[root@centos-64-72a ~]# ldd /usr/bin/vim|cut -d / -f 2,3|wc

     20      40     783

(cut -d /表示指定分隔符为/,-f 2,3表示指定字段标号)


  7) 找出/proc/meminfo文件中,所有以大写S或小写s开头的行,你有多少种方法实现该任务?


[root@centos-64-72a ~]# cat /proc/meminfo|grep "^[Ss]"

[root@centos-64-72a ~]# cat /proc/meminfo|grep "^S\|^s"


  8) 使用egrep取出某个路径的基名;


[root@centos-64-72a ~]# echo /etc/passwd|egrep -o "[^/]+/?$"

passwd

[root@centos-64-72a ~]# echo /etc/passwd|egrep -o "[^/]+$"

passwd

(-o选项表示关闭贪婪模式,[^/]+表示不要/符号但是/符号至少出现了一次,/?表示/符号可有可无,$符号表示锚定行尾)


  9) 显示出ifconfig命令结果中的0-255之间的整数;


[root@centos-64-72a ~]# ifconfig | grep "\<0[0-9][0-9]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\>"|wc

     11      63     623

[root@centos-64-72a ~]# ifconfig | egrep "<0[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]>"|wc

     11      63     623


  10) 添加用户bash, testbash, basher, nologin, unlogin, logining,要求前三个用户的默认shell为/bin/bash,后三个用户的默认shell为/sbin/nologin,而后找出其用户名与shell名相同的用户信息;


[root@centos-64-72a ~]# useradd -s /bin/bash bash;useradd -s /bin/bash testbash;useradd -s /bin/bash basher;useradd -s /sbin/nologin nologin;useradd -s /sbin/nologin unlogin;useradd -s /sbin/nologin logining

[root@centos-64-72a ~]# egrep "^([[: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:8093:8094::/home/bash:/bin/bash

nologin:x:8096:8097::/home/nologin:/sbin/nologin

(([[:alnum:]]*\>)表示匹配组,.*表示任意长度字符\1表示(([[:alnum:]]*\>)))


2.脚本练习:

  1) 编写一个脚本,要求:

    统计/etc, /var, /usr目录中所有非隐藏的一级子目录和文件的数量总和;


[root@centos-64-72a ~]# vim wc

#!/bing/bash

#脚本说明:统计/etc, /var, /usr目录中所有非隐藏的一级子目录和文件的数量总和;

#版本说明:牛刀小试

ls /etc /var /usr|egrep "[^.]"|wc -l

:wq

[root@centos-64-72a ~]# sh wc

314

(脚本首行必须是shebang,也就是#!/bing/bash,除了shebang之外,以#占据绝对行首的内容,均为注释行;解释器会忽略这样的行的内容)


  2) 编写一个脚本,要求:

    对于目录/tmp/testdir1,如果当前有效用户有读、写和执行的权限,那么就在该目录中创建一个文件;否则,显示“没有权限不能创建文件”的信息。


[root@centos-64-72a ~]# vim touch

#!/bing/bash

#脚本说明:对于目录/tmp/testdir1,如果当前有效用户有读、写和执行的权限,那么就在该目录中创建一个文件;否则,显示“没有权限不能创建文件”的信息。

#版本说明:牛刀小试

test -r /tmp/testdir1&&test -w /tmp/testdir1&&test -x /tmp/testdir1&&touch /tmp/testdir1/创建文件||echo "没有权限不能创建文件"

:wq

[root@centos-64-72a ~]# sh touch

(这个脚本对root权限用户无效,只对普通用户有效.)


  3) 编写一个脚本,要求:

    从/etc/passwd中UID和GID相同的用户中随机选择一个用户,判断其用户名和基本组名是否相同;


#!/bing/bash

#脚本说明:从/etc/passwd中UID和GID相同的用户中随机选择一个用户,判断其用户名和基本组名是否相同;

#版本说明:牛刀小试

egrep "(\<[0-9]+\>).*\1" /etc/passwd|sort -R|head -1|awk ‘{print $3==$4}‘

:wq


*7 正则表达式的练习