字符及文本处理之二:grep及正则表达式详解

前端之家收集整理的这篇文章主要介绍了字符及文本处理之二:grep及正则表达式详解前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一、作业(练习)内容:

1、总结本此课程中所涉及命令的使用方法及相关示例展示

grep:文本搜索工具,根据用户指定的文本"模式"(正则表达式元字符及正常字符组成而成)对目标文件进行逐行搜索显示匹配的行

元字符:不表示字符表面的含义,而是表示通配和控制功能

grep [OPTIONS]... [PATTERN] [FILENAME]...

--color=auto #对匹配到的字符串作高亮显示

-i #忽略大小写

-v #仅显示匹配不到行

-O #仅显示匹配到的字符串

-c #统计包含匹配的

-q #静默模式

-E #支持扩展正则表达式

-n #显示其在原文件中的行号

-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规范

3、显示/etc/passwd文件中以bash结尾的行

[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~]#

4、显示/etc/passwd文件中的两位数或三位数

[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~]#

猜你在找的正则表达式相关文章