正则表达式
一:基本正则表达式
正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
1、字符匹配
- .:任意字符
- []:匹配指定范围内的单个字符
- [^]:匹配指定范围外的单个字符
- [:alnum:] 字母和数字
- [:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
- [:lower:] 小写字母 [:upper:] 大写字母
- [:blank:] 空白字符(空格和制表符)
- [:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
- [:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
- [:digit:] 十进制数字 [:xdigit:]十六进制数字
- [:graph:] 可打印的非空白字符
- [:print:] 可打印字符
- [:punct:] 标点符号
2、匹配次数
用在要指定次数的字符后面,用于指定前面的字符要出现的次数
- *:匹配前边的字符任意次
- .*:匹配任意字符任意次,表示所有
- \?:匹配前边字符0或一次,表示前边字符可有可无
- \{m\}:匹配前边字符m次
- \{m,n\}:匹配前边字符最少m次,最多n次
- \{,n\}:匹配前边字符至多n次
- \{m,\}:匹配前边字符至少m次
3、位置锚定
- ^:行首锚定,用于模式的最左侧
- $:行尾锚定,用于模式的最右侧
- ^PATTERN$:用于模式匹配整行
- ^$:匹配空行
- ^[[:space:]]*$:匹配空白行
- \<或\b:单词锚定,用于单词模式的左侧
- \>或\b:单词锚定,用于单词模式的右侧
- \<PATTERN\>:匹配整个单词
- \(\) 分组:将多个字符捆绑一起当做一个字符用
- \|:或
- \1:从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
- \2:从左侧起,第二个左括号以及与之匹配右括号之间的模式所匹配到的字符
- 后向引用:引用前面的分组括号中的模式匹配字符,(而非模式本身)
- Note:分组括号中的模式匹配到的内容会被正则表达式引擎记录与内部的变量中,这些变量的命名方式为\1,\2,\3...
\(ab\+\(xy\)*\) \1:ab\+\(xy\)* \2:xy
二:扩展的正则表达式
正则表达式与扩展正则表达式类似,只是扩展正则表达式表达更加简单。
正则表达式需要打 \ 转义字符 来表示某些字符的意思,而扩展正则表达式则不需要:
- \{m} 正则表达式表示至少表示前面的字符m次 {m} egrep一样
- \? 正则表达式表示前面的字符0或1次 ? egrep一样
- \+ 正则表达式表示前面的字符至少一次 + egrep一样
- \(\) 正则表达式表示分组 () egrep一样
- \| 正则表达式表示或 | egrep一样
练习:
1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法) # cat /proc/meminfo |grep -i "^s" # cat /proc/meminfo |grep "^\(s\|S\)" 2、显示/etc/passwd文件中不以/bin/bash结尾的行 # grep -v "/bin/bash$" /etc/passwd 3、显示用户rpc默认的shell程序 # getent passwd rpc |grep -o "/[s]\?bin/.*" 4、找出/etc/passwd中的两位或三位数 # getent passwd |grep -o "\b[[:digit:]]\{2,3\}\b" 5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面有非空白字符的行 # cat /etc/grub2.cfg |grep "^[[:space:]]\+" |grep -v "^[[:space:]]*$" 6、找出“netstat -tan”命令结果中以LISTEN后跟任意多个空白字符结尾的行 # netstat -tan |grep "ESTABLISHED" 7、显示CentOS7上所有系统用户的用户名和UID # getent passwd |cut -d: -f1,3 8、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户名和shell同名的行 # getent passwd |grep "^\(\<[[:alnum:]]*\).*/\1$" 9、利用df和grep,取出磁盘各分区利用率,并从大到小排序 df |grep "sd[a-z]" |grep -o "[0-9]\{1,3\}%" |grep -o '[[:digit:]]*'
1、显示三个用户root、user1、test的UID和默认shell # getent passwd |grep -e "^root" -e "^user1" -e "^test" | cut -d: -f1,3,7 2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行 # cat /etc/rc.d/init.d/functions |grep "^\b[[:alpha:]]*()" 3、使用egrep取出/etc/rc.d/init.d/functions中其基名 # echo /etc/rc.d/init.d/functions |grep -o "[[:alnum:]]\+$" 4、使用egrep取出上面路径的目录名 # echo /etc/rc.d/init.d/functions |grep -o "^/.*/" 5、统计last命令中以root登录的每个主机IP地址登录次数 # last |grep "^root" |grep -Eo "([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])" |sort |uniq -c 6、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255 [0-9] [1-9][0-9] 1[0-9][0-9] 2[0-4][0-9] 25[0-5] 7、显示ifconfig命令结果中所有IPv4地址 # ifconfig |grep "inet[^[:digit:]]"|grep -Eo "([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])" 8、将此字符串:welcome to linux world中的每个字符去重并排序,重复次数多的排到前面 # echo "welcome to linux world" |grep --color=auto -o "[[:alpha:]]" |sort |uniq -c |sort -nr