20171015老男孩第41期第6周课程中讲到了grep/egrep命令的四个选项:
1. -i 不区分大小写,即不区分:aA
2. -w 按照单词 进行匹配(括号外的意思是老师讲的,但我总感觉这样理解起来有点疑惑,然后课下详细询问了一下老师-w选项的意义,然后自己总结了一下感觉好象应该叫做:全字符精确匹配/完全匹配)
3. -n 显示行号
4. -o 显示grep执行过程 grep正则把每次匹配到的内容显示出来
其中第1、3、4个选项很容易理解,但是第二个选项就有些不太容易理解了。下面我们通过试验来加深一下对-w这个选项的理解。
第一步:创建试验环境:
cat > test.txt <<EOFI am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
EOF
第二步:使用-w选项,找出大于5位并且小于6位的字符串
[root@oldboyedu41-1 tmp]# egrep -w '[a-z]{5,6}' test.txt I am oldboy teacher!I teach linux.I like badminton ball ,billiard ball and chinese chess!my blog is http://oldboy.blog.51cto.commy god ,i am not oldbey,but OLDBOY![root@oldboyedu41-1 tmp]# egrep -wo '[a-z]{5,6}' test.txt oldboyteachlinuxchessoldboyoldbey[root@oldboyedu41-1 tmp]# egrep -o '[a-z]{5,6}' test.txt oldboyteacheteachlinuxbadminbilliachineschessoldboyetiantoldbey
egrep -w '[a-z]{5,6}' test.txt 这条命令中,[a-z]代表取从小写的a到小写的z,{5,6}代表取最少5位,最多6位的字符串。
如果不加-w选项,就不是精确/完全匹配,而是即使某个字符串大于6位,也会取其中的6位做为符合条件的一项取值。
如果加上-w选项,则是只取>=5位,<=6位的字符串,超出这个范围的一律无视。
第三步:以一个简单的自制题目加深对-w选项的理解
题目:查找qq.txt文件中,填写正确的qq号。
创建试验环境:
cat >qq.txt <<EOF0221234567801012345678123456789143827301122334412345123456781200000112312340123456789054321654321765432112345678912345678912345678901234567890EOF
分析:什么是正确的qq号?
一般情况下(暂时排除极端情况)正确的qq号至少应该符合两个最基本的条件:
非零开头:以零开头的一般是带区号的电话号码,比如010XXXXXXXX,022XXXXXXXX,这些要排除掉。
位数5-11位:qq号至少5位,目前最多11位。
那么这个题目其实就很简单了,第一步先排除掉以零开头的错误qq号:
[root@oldboyedu41-1 tmp]# grep -v "^0" qq.txt1234567891438273011223344123451234567812000001123123454321654321765432112345678912345678912345678901234567890
第二步取出>=5位并且<=11位的纯数字字符串
取纯数字使用[0-9]即可,取>=5位并且<=11位使用{5,11}即可。
[root@oldboyedu41-1 tmp]# grep -v "^0" qq.txt |egrep "[0-9]{5,11}" -n1:1234567892:143827303:112233444:123455:123456786:120000019:5432110:65432111:765432112:12345678912345678913:12345678901234567890
这一步出现了一个问题(感谢陈哲同学提醒):大于11位的第12行和第13行也被取出来了。这是为什么呢?
使用-o选项看一下,到底取的是什么?
[root@oldboyedu41-1 tmp]# grep -v "^0" qq.txt |egrep "[0-9]{5,11}" -no1:1234567892:143827303:112233444:123455:123456786:120000019:5432110:65432111:765432112:1234567891212:345678913:1234567890113:234567890
原来第12行和第13行被分成了同时满足条件的两组字符串,被取了出来。这时就用到了-w这个选项。
[root@oldboyedu41-1 tmp]# grep -v "^0" qq.txt |egrep "[0-9]{5,11}" -nw1:1234567892:143827303:112233444:123455:123456786:120000019:5432110:65432111:7654321
另外请教大神指点:grep -v "^0" qq.txt |egrep "[0-9]{5,11}" -nw 这条命令能否合并成一条命令?
本文出自 “老潘Linux” 博客,请务必保留此出处http://oldpan.blog.51cto.com/1603893/1973128