1.创建一个文档FILE,里面写如下内容:
he love his lover
she like her liker
they love their liker
使用grep命令来搜索以l开头,以e结尾即l..e和l..er的字符串
答案:
#grep --color=auto “\(l[[:alpha:]]\{2\}e\).*\1r” FILE
#grep –E --color=auto “(l[[:alpha:]]{2}e).*\1r” FILE
解析:
前面的[[:alpha:]]意思是任意字母
\{2\} 表示精确匹配两次之前的任意字母
l[[:alpha:]]\{2\}e 就是指l..e 也可以写为l[[:alpha:]][[:alpha:]]e
l[[:alpha:]]\{2\}e加上\(\)就代表\(l[[:alpha:]]\{2\}e\)整体要被后面引用
之后的.*代表中间的任意长度任意字符
再后面的\1意思就是引用前面的\(l[[:alpha:]]\{2\}e\)
然后后面再加个r变为\1r就成了l..er
这个例子的主要目的是练习\(\) \1 \2 \3 à前后匹配,引用此前出现过的字符
的使用,所以,前面的\(l[[:alpha:]]\{2\}e\).*\1r还可以写为\(l[[:alpha:]]\{2\}\)\(e\).*\1\2r这里只不过是把e给\(\)起来,然后后面再用\2引用,效果跟之前是一样的,都表示l..e.*l..er
2.查找如下字符串中形如xxx.xxx.xxx.xxx的字符串,其中x必须是数字
abc.124.221.345
12a.222.443.256
12.235.111.555
212.592.111.303
222?333.111/453
111.222.333.444
1.2.44.122
答案:
#grep --color=auto “[[:digit:]]\{3\}\.[[:digit:]]\{3\}\.[[:digit:]]\{3\}\.[[:digit:]]\{3\}” FILE
会显示出如下结果:
212.592.111.303
111.222.333.444
解析:
[[:digit:]]指的是任意数字,也可以用[0-9]替代
\{3\}指的是前面的任意数字引用3次
\.指的是点即. 这里.之前必须加\转译,否则就会成为匹配任意单个字符,比如如果写成[[:digit:]]\{3\}. 那么这一题的答案就会在显示出212.592.111.303和111.222.333.444的同时还显示出222?333.111/453
组合起来就成了[[:digit:]]\{3\}\. 即xxx.
也可以写成:
#grep –color=auto “[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}” FILE
还可以写成#grep -E –color=auto “([0-9]{3}\.){3}[0-9]{3}” FILE
如果这一题只想搜索出111.222.333.444这种重复型数字的结果,那么可以写为
# grep --color=auto "\([0-9]\)\1\1\.\([0-9]\)\2\2\.\([0-9]\)\3\3\.\([0-9]\)\4\4" FILE
这里就是检查对\(\) \1 \2 \3 的应用了 \([0-9]\)\1\1\.对应111. \([0-9]\)\2\2\.对应222. \([0-9]\)\3\3\.对应333. \([0-9]\)\4\4对应444
如果这一题想搜出所有正确的1到3位数字和.组成的序列,可以写为
#egrep --color=auto "([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}" FILE
还可以写为
#egrep --color=auto "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-1][0-9]|22[0-3])(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])){2}(\.([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4]))\>" FILE 这种写法主要联系扩展正则表达式中|或的用法,注意A|B之后还要写别的,那么一定要把A|B用小括号括起来,即(A|B)
扩展:搜索里面合法的IP地址,可以写为
合法IP地址:
第一个.前的应该是[1-9]或者[1-9][0-9]即1-99或者1[0-9][0-9]即100-199或者
2[0-1][0-9]即200-219或者22[0-3];组合起来合法IP的第一段就是
[1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|22[0-3]
优化可以写为[1-9]|[1-9][0-9]|1[0-9]{2}|2[0-1][0-9]|22[0-3]
后面两段:
[0-9]或者[1-9][0-9]即1-99或者1[0-9]{2}即100-199或者2[0-4][0-9]即200-249或者25[0-5]即250-255
组合起来就是[0-9]| [1-9][0-9]| 1[0-9]{2}|2[0-4][0-9]| 25[0-5]
最后一段:
[1-9]这里只能是1-9不能为0或者[1-9][0-9]即1-99或者1[0-9]{2}即100-199或者2[0-4][0-9]即200-249或者25[0-4]即250-254
组合起来最后就是搜索一个合法IP,记得这里还要在前后加词首,词尾锚定符,否则,因为grep命令的贪婪工作模式,如果出现224.0.1.253或者192.168.0.259也会被当成24.0.1.253和192.168.0.25正确的选项
#egrep --color=auto "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-1][0-9]|22[0-3]) (\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){2} (\.([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4]))\>” FILE
3.显示/proc/meminfo中以不区分大小写的s开头的行
#grep --color=auto “^[sS].*” /prpc/meminfo
# grep -E --color=auto "^[sS].*" /proc/meminfo
4.显示/etc/passwd中以nologin结尾的行
#grep --color=auto “nologin$” /etc/passwd
5.显示/etc/inittab中以#开头,且在后面跟一个或者多个空白字符,而后又跟了任意非空白字符的行
#grep –color=auto “^#[[:space:]]\{1,\}[^[:space:]]\{1,\}” /etc/inittab
或者#grep -E --color=auto "^#[[:space:]]{1,}[^[:space:]]{1,}" /etc/inittab
6.显示/etc/inittab中包含了:一个数字:的行
#grep --color=auto “:[[:digit:]]:” /etc/inittab
还可以写为# egrep --color=auto "^[[:space:]]{1,}" /boot/grub/grub.conf
7.显示/boot/grub/grub.conf文件中以一个或者多个空白字符开头的行
#grep --color=auto “^[[:space:]]\{1,\}” /boot/grub/grub.conf
8.显示/etc/inittab文件中以一个数字开头并以一个与数字开头相同的数字结尾的行
#grep --color=auto “^\([[:digit:]]\).*\1$” /etc/inittab
# egrep --color=auto "^([[:digit:]]).*\1$" /etc/inittab
9.查找当前系统上名字为user1的用户的账号的相关信息,/etc/passwd,user11,myuser1
#grep --color=auto “^user1\>” /etc/passwd
10.查找当前系统上以其为附加组的用户有两个或者两个以上的组的相关信息,/etc/group , :
#grep --color=auto “[^:]*:[^:]*:[^:]*:[[:alnum:]]\{1,\},.*” /etc/group
# egrep --color=auto "([^:]*:){3}([[:alnum:]]*,){1,}.*" /etc/group
11.查找当前系统上其用户账号密码最长使用期限为99999天的用户账号的相关信息
#grep --color=auto “[^:]*:[^:]*:[^:]*:[^:]*:99999:” /etc/shadow
#grep –E --color=auto “([^:]*:){4}99999:” /etc/shadow
这里还可管道来只显示出用户名和99999天
#egrep --color=auto "([^:]*:){4}99999:" /etc/shadow|cut -d: -f1,5
12.分析/etc/inittab文件中如以下两行的文本特征,请写出可以精确找到类似两行的模式,而且要求每一行中出现在数字必须相同:
l1:1:wait:/etc/rc.d/rc 1
l5:5:wait:/etc/rc.d/rc 5
#grep –color=auto “l\([15]\):\1:wait:/etc/rc.d/rc[[:space:]]\{1,\}\1” /etc/inittab
#egrep --color=auto "l([15]):\1:wait:/etc/rc.d/rc([[:space:]]){1,}\1" /etc/inittab