一、作业(练习)内容:
1、总结本此课程中所涉及命令的使用方法及相关示例展示
grep:文本搜索工具,根据用户指定的文本"模式"(正则表达式元字符及正常字符组成而成)对目标文件进行逐行搜索,显示匹配的行
grep [OPTIONS]... [PATTERN] [FILENAME]...
--color=auto #对匹配到的字符串作高亮显示
-i #忽略大小写
-v #仅显示匹配不到行
-O #仅显示匹配到的字符串
-c #统计包含匹配的
-q #静默模式
-E #支持扩展正则表达式
-A N: #显示匹配到的行及其下面的N行
-B N: #显示匹配到的行及其上面的N行
-C N: #显示匹配到的行及其上N行和下N行
egrep 相当于 “grep -E”支持扩展正则表达式
fgrep 相当于 “grep” 但不支持正则表达式,查找速度快
[root@xxj~]#cat2test heel,world rootaddtm linuxfedoracentos frootgentoosuselinuxmint rootaddtm linuxfedoracentos fRootgentoosuselinux [root@xxj~]#grep"root"2test rootaddtm frootgentoosuselinuxmint rootaddtm [root@xxj~]#grep-v"root"2test heel,world linuxfedoracentos linuxfedoracentos fRootgentoosuselinux [root@xxj~]#grep-i"root"2test rootaddtm frootgentoosuselinuxmint rootaddtm fRootgentoosuselinux [root@xxj~]#grep-in"root"2test 2:rootaddtm 4:frootgentoosuselinuxmint 5:rootaddtm 7:fRootgentoosuselinux [root@xxj~]#grep-ion"root"2test 2:root 4:root 5:root 7:Root [root@xxj~]#grep-n-C3root/etc/passwd 1:root:x:0:0:chfnroot:/root:/bin/bash 2-bin:x:1:1:bin:/bin:/sbin/nologin 3-daemon:x:2:2:daemon:/sbin:/sbin/nologin 4-adm:x:3:4:adm:/var/adm:/sbin/nologin -- 8-halt:x:7:0:halt:/sbin:/sbin/halt 9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10-uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin 11:operator:x:11:0:operator:/root:/sbin/nologin 12-games:x:12:100:games:/usr/games:/sbin/nologin 13-gopher:x:13:30:gopher:/var/gopher:/sbin/nologin 14-ftp:x:14:50:FTPUser:/var/ftp:/sbin/nologin [root@xxj~]#
2、总结基本正则表达式及扩展正则表达式
基础正则表达式:
字符匹配:
. 任意单个字符
[] 匹配方括号内出现的任一字符,比如说单向选择题的答案,可能是ABCD选项中的任意一种,用正则表达式表示就是[ABCD],如果遇到比较大范围的匹配,就需要使用“-”号做范围限定如[a-z]表示所有的小写字母,一直要注意,这里“-”号不是充单一个字符
[^] 指定范围外的任意单个字符
常用的字符集合:
[a-z] 注意在文件名通配中是表示所有字母,包括大小写,在正则表达式中只表示小写
[A-Z],[0-9],[a-zA-Z0-9],[^a-zA-Z0-9],[a-z_\-]
[:lower:],[:upper:],[:digit:],[:alnum:],[:punct:],[:space:],[^:lower:],
\w:匹配字母,数字和下划线,等价于[[:alnum:]_]
\W:匹配非字母、非数字、非下划线,等价于[^[:alnum:]_]
\s:匹配任何空白字符
\S:匹配任何非空白字符
次数匹配:在期望匹配字符后面提供一个控制符,用于表达匹配其前面字符指定次数
* 任意次数
.* 任意长度任意字符(但不包含\n换行的字符)
\? 0次或1次
\+ 至少1次
\{M\} M次
\{M,N\} 至少M次,至多N次
\{0,N\},\{M,}
位置匹配:
^ 行首
$ 行尾
^$ 匹配空白行 "^[[:space:]]*$" 匹配包含任意空白字符的空白行
\<或\b 词首 \<PATTERN 或 \bPATTER
\>或\b 词尾 PATTERN\> 或 PATTERN\b
注意:词首,词尾可以分开来单独使用的
\B 匹配非单词的边界:如hello\B可以“helloworld"但不能匹配“hello”
分组:
\(PATTERN\) "\(ab\)*c"
后向引用: 分组中的模式,在某次的具体匹配过程中所匹配到的字符,可以被grep 记忆(保存在内置变量中\1,\2、、、、\n)因此可以被引用。
\1: 引用,模式中自左而右,由第一个左括号以及与之对应的右括号内的内容
\2: 引用,模式中自左而右,由第一个左括号以及与之对应的右括号内的内容
或者:a\|b a或b 逐单词而不是逐字符
扩展正则表达式:所谓的GRU ERE其实只是个说法而已,它有的功能GNU BRE都有了,只是元字符不需要转义而已。
字符匹配:和基础正则表达式一样
次数匹配:和基础正则表达式一样,只是{},?,+不用加\
位置匹配: 和基础正则表达式一样
分组:和基础正则表达式一样,只是()不用加\
或者: a|b a或b 逐单词而不是逐字符
C|cat: 不表示Cat或cat,而表示C或cat,要写成(C|c)at
关于正则表达式的POSIX规范详见:Linux/Unix工具与正则表达式的POSIX规范
[root@localhost~]#grep"\<bash\>$"/etc/passwd root:x:0:0:root:/root:/bin/bash xiejun:x:500:500::/home/xiejun:/bin/bash xj:x:501:501::/home/xj:/bin/bash stu100:x:502:503::/home/stu100:/bin/bash stu101:x:503:504::/home/stu101:/bin/bash stu102:x:504:505::/home/stu102:/bin/bash stu105:x:505:506::/home/stu105:/bin/bash stu106:x:506:507::/home/stu106:/bin/bash stu107:x:507:508::/home/stu107:/bin/bash stu110:x:508:509::/home/stu110:/bin/bash stu111:x:509:510::/home/stu111:/bin/bash stu112:x:510:511::/home/stu112:/bin/bash stu120:x:511:512::/home/stu120:/bin/bash stu121:x:512:513::/home/stu121:/bin/bash stu122:x:513:514::/home/stu122:/bin/bash stu130:x:514:515::/home/stu130:/bin/bash stu131:x:515:516::/home/stu131:/bin/bash stu132:x:516:517::/home/stu132:/bin/bash usersb:x:572:573::/home/usersb:/bin/bash user2b:x:573:574::/home/user2b:/bin/bash usersib:x:574:575::/home/usersib:/bin/bash 22b:x:575:576::/home/22b:/bin/bash userx111:x:576:577::/home/userx111:/bin/bash userx222:x:577:578::/home/userx222:/bin/bash userj333x111:x:578:579::/home/userj333x111:/bin/bash user10:x:579:580::/home/user10:/bin/bash user11:x:580:581::/home/user11:/bin/bash user12:x:581:582::/home/user12:/bin/bash user13:x:582:583::/home/user13:/bin/bash user14:x:583:584::/home/user14:/bin/bash user15:x:584:585::/home/user15:/bin/bash user16:x:585:586::/home/user16:/bin/bash user17:x:586:587::/home/user17:/bin/bash user18:x:587:588::/home/user18:/bin/bash user19:x:588:589::/home/user19:/bin/bash MysqL:x:27:27:MysqLServer:/var/lib/MysqL:/bin/bash bash:x:589:590::/home/bash:/bin/bash testbash:x:590:591::/home/testbash:/bin/bash basher:x:591:592::/home/basher:/bin/bash 22:x:593:594::/home/22:/bin/bash centos:x:594:595::/home/centos:/bin/bash user1:x:595:596::/home/user1:/bin/bash [root@localhost~]#
[root@xxj~]#grep-o"\<[1-9][0-9]\{1,2\}\>"/etc/passwd 12 10 14 11 12 100 13 30 14 50 99 99 81 81 69 69 499 76 89 89 74 74 501 501 502 502 503 503 504 504 505 505 506 506 507 507 498 498 [root@xxj~]#
5、显示`netstat -tan`命令结果中以‘LISTEN’后跟0个、1个或者多个空白字符结尾的行
[root@xxj~]#netstat-tan|egrep"(LISTEN[[:space:]]*)$" tcp000.0.0.0:220.0.0.0:*LISTEN tcp00127.0.0.1:250.0.0.0:*LISTEN tcp00:::22:::*LISTEN tcp00::1:25:::*LISTEN [root@xxj~]#
6、添加用户bash、testbash、basher以及nologin用户(nologin用户的shell为/sbin/nologin);而后找出/etc/passwd文件中用户名与其shell名相同的行
[root@localhost~]#useraddbash [root@localhost~]#useraddtestbash [root@localhost~]#useraddbasher [root@localhost~]#useradd-s/sbin/nologinnologin [root@localhost~]#tail-n5/etc/passwd MysqL:x:27:27:MysqLServer:/var/lib/MysqL:/bin/bash bash:x:589:590::/home/bash:/bin/bash testbash:x:590:591::/home/testbash:/bin/bash basher:x:591:592::/home/basher:/bin/bash nologin:x:592:593::/home/nologin:/sbin/nologin [root@localhost~]# [root@localhost~]#grep"^\(\<[[: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:589:590::/home/bash:/bin/bash nologin:x:592:593::/home/nologin:/sbin/nologin [root@localhost~]#
7、显示当前系统上root、centos或者user1用户的默认shell和UID (请事先创建这些用户,若不存在)
[root@localhost~]#egrep"^(\<root|centos|user1\>)"/etc/passwd|cut-d:-f3,7 0:/bin/bash 594:/bin/bash 595:/bin/bash [root@localhost~]#
8、找出/etc/rc.d/init.d/functions文件中某单词(单词中间可以存在下划线)后面跟着一组小括号的行
[root@localhost~]#grep"\<[[:alpha:]_]\+\>()"/etc/rc.d/init.d/functions fstab_decode_str(){ checkpid(){ __readlink(){ __fgrep(){ __umount_loop(){ __umount_loopback_loop(){ __pids_var_run(){ __pids_pidof(){ daemon(){ killproc(){ pidfileofproc(){ pidofproc(){ status(){ echo_success(){ echo_failure(){ echo_passed(){ echo_warning(){ update_boot_stage(){ success(){ failure(){ passed(){ warning(){ action(){ action_silent(){ strstr(){ confirm(){ get_numeric_dev(){ is_ignored_file(){ is_true(){ is_false(){ apply_sysctl(){ key_is_random(){ find_crypto_mount_point(){ init_crypto(){ [root@localhost~]#
9、使用echo输出一个路径,而后egrep找出其路径基名要注意基名后面有没有“/”有则去掉;进一步的使用egrep取出其目录名
[root@localhost~]#echo"/etc/rc.d/init.d/functions/"|egrep-o"[^/]+/?$"|cut-d/-f1 functions#注意:文件名可以是“/”以外任意字符命名
[root@localhost~]#echo"/etc/rc.d/init.d/functions/"|egrep-o".+/[^/]"|cut-d/-f1-4 /etc/rc.d/init.d#想了一上午,想不到其它的方法,不知道这样算不算 [root@localhost~]#
10、找出ifconfig命令执行结果中1-255之间的数字
[root@localhost~]#ifconfig|egrep-o"\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>" 29 15 172 16 11 166 172 16 11 255 255 255 255 64 1 6 9 1 4 127 1 255 1 128 1 [root@localhost~]#