首页 > 代码库 > *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 正则表达式的练习