[root@service99 regular]# cat -n /etc/vsftpd/vsftpd.conf | wc -l 121 [root@service99 regular]# grep -vE '^#|^$' /etc/vsftpd/vsftpd.conf //v表示反选,E表示支持扩展正则“|”是扩展正则的符号,往下看,后面有 anonymous_enable=YES local_enable=YES write_enable=YES local_umask=022 anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES anon_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES
字符出现范围
{n,m} //前一个字符出现了n到m次
{n,} //前一个字符出现了n次以上
{n} //前一个字符出现了n次
[root@service99 regular]# grep --color "12345\{0,1\}" price.txt 1234556 [root@service99 regular]# grep --color "12345\{0,2\}" price.txt 1234556
点字符
点特殊字符用于匹配除换行符之外的任意单个字符,但点字符必须匹配一个字符;如果在圆点位置没有字符,那么模式匹配失败。
[root@service99 regular]# grep --color ".s" price.txt This price is $4.99 This is "\". This is ^ test. [root@service99 regular]# grep --color ".or" price.txt hello,world!
字符类
字符类可以定义一类字符来匹配文本模式中的某一位置。如果在字符类中的某一字符在数据流中,就和模式匹配。
为定义字符类,需要使用方括号。应该将要包括在该类中的所有字符用方括号括起来,然后模式中使用整个字符类,就像任意的其他通配符一样。
[root@service99 regular]# grep --color "[abcdsxyz]" price.txt This price is $4.99 hello,world! This is "\". This is ^ test. [root@service99 regular]# grep --color "[sxyz]" price.txt This price is $4.99 This is "\". This is ^ test. [root@service99 regular]# grep --color "[abcd]" price.txt This price is $4.99 hello,world! [root@service99 regular]# grep --color "Th[ais]" price.txt //Th 后的第一个字符在【ais】中匹配的 This price is $4.99 This is "\". This is ^ test. [root@service99 regular]# grep -i --color "th[ais]" price.txt //-i 表示不区分大小写 This price is $4.99 This is "\". This is ^ test.
如果不能确定某个字符的大小写,就可以使用该模式:
[root@service99 regular]# echo "Yes" | grep --color "[yY]es" []内字符顺序没有影响 Yes [root@service99 regular]# echo "yes" | grep --color "[Yy]es" yes
在单个表达式内可以使用多个字符类:
[root@service99 regular]# echo "Yes/no" | grep "[Yy][Ee]" Yes/no [root@service99 regular]# echo "Yes/no" | grep "[Yy].*[Nn]" //*在正则表达式中的用法,请往下看 Yes/no
字符类对数字同样支持:
[root@service99 regular]# echo "My phone number is 123456987" | grep --color "is [1234]" My phone number is 123456987 [root@service99 regular]# echo "This is Phone1" | grep --color "e[1234]" This is Phone1 [root@service99 regular]# echo "This is Phone1" | grep --color "[1]" This is Phone1
字符类还有一种极为常见的用途是解析可能拼错的单词:
[root@service99 regular]# echo "regular" | grep --color "r[ea]g[ua]l[ao]" regular
否定字符类
用于查找不在该字符类中的字符,只需在字符类范围的开头添加脱字符(^).
即使使用否定,字符类仍必须匹配一个字符。
[root@service99 regular]# cat price.txt This price is $4.99 hello,world! $5.00 #$#$ This is "\". this is ^ test. cat car [root@service99 regular]# sed -n '/[^t]his/p' price.txt This price is $4.99 This is "\". [root@service99 regular]# grep --color "[^t]his" price.txt This price is $4.99 This is "\". [root@service99 regular]# grep --color "ca[tr]" price.txt cat car [root@service99 regular]# grep --color "ca[^r]" price.txt cat
使用范围
当你需要匹配的字符很多并且有一定规律时,可以这样:
[root@service99 regular]# cat price.txt This price is $4.99 hello,world! $5.00 #$#$ This is "\". this is ^ test. cat car 1234556 911 11806 [root@service99 regular]# egrep --color '[a-z]' price.txt This price is $4.99 hello,world! This is "\". this is ^ test. cat car [root@service99 regular]# egrep --color '[A-Z]' price.txt This price is $4.99 This is "\". [root@service99 regular]# grep --color "[0-9]" price.txt This price is $4.99 $5.00 1234556 911 11806 [root@service99 regular]# sed -n '/^[^a-Z]/p' price.txt $5.00 #$#$ 1234556 911 11806 [root@service99 regular]# grep --color "^[^a-Z]" price.txt $5.00 #$#$ 1234556 911 11806 [root@service99 regular]# echo $LANG //在使用 [a-Z]时,注意LANG环境变量的值,该值若是进行修改的话,要注意修改的值的合法性 zh_CN.UTF-8 [root@service99 regular]# LANG=en_US.UTF-8
特殊字符类
用于匹配特定类型的字符。
[[:blank:]] 空格(space)与定位(tab)字符
[[:cntrl:]] 控制字符
[[:graph:]] 非空格(nonspace)字符
[[:space:]] 所有空白字符
[[:print:]] 可显示的字符
[[:xdigit:]] 十六进制数字
[[:punct:]] 所有标点符号
[[:lower:]] 小写字母
[[:upper:]] 大写字母
[[:alpha:]] 大小写字母
[[:digit:]] 数字
[[:alnum:]] 数字和大小写字母
星号
在某个字符之后加一个星号表示该字符在匹配模式的文本中不出现或出现多次