正则表达式分为:“基本正则表达式 BRE”跟“扩展正则表达式 ERE”
基本正则表达式:
(1)字符匹配
"."任意单个字符
"[]"匹配指定范围内的单个字符
"[^]"匹配字符以外的单个字符
(2)次数匹配
"*"匹配前面字符的任意次 (.*:组合就相当于glob中的"*"匹配任意字符任意次)
"\?"匹配前面的字符0次或1次;"\+"匹配前面的字符至少1次
"\{m\}"匹配前面的字符"m"次;"\{m,n\}"匹配前面的字符至少"m"次至多"n"次
(3)位置锚定
"^"行首;"$"行尾;("^$":真空行,什么都没有。 "^[[:space:]]*$"有空白字符的空行。)
"\<"或"\b"词首;"\>"或"\b"词尾;
(4)分组
"\(\)"将一个或多个字符捆绑在一起,当一个整体处理;
"\1"后项引用,引用从左向右数第一个分组所匹配到的字符;以此类推"\2"就是第2个分组所匹配到的字符,"\3"就是第三个….
(图很丑看明白就好,哈哈..)
注意:后项引用是直接使用前一个分组已经匹配出来的字符结果,而次数匹配的是相当于在做1次或多次匹配
扩展正则表达式:
(1)字符匹配
"."任意单个字符
"[]"匹配指定范围内的单个字符
"[^]"匹配字符以外的单个字符
(2)次数匹配
"*"匹配前面字符的任意次 (.*:组合就相当于glob中的"*"匹配任意字符任意次)
"?"匹配前面的字符0次或1次;"+"匹配前面的字符至少1次
"{m}"匹配前面的字符"m"次;"{m,n}"匹配前面的字符至少"m"次至多"n"次
(3)位置锚定
"^"行首;"$"行尾;("^$":真空行,什么都没有。 "^[[:space:]]*$"有空白字符的空行。)
"\<"或"\b"词首;"\>"或"\b"词尾;
(4)分组
"()"将一个或多个字符捆绑在一起,当一个整体处理;
"\1"后项引用,引用从左向右数第一个分组所匹配到的字符;以此类推"\2"就是第2个分组所匹配到的字符,"\3"就是第三个….
(5)或者 "|" a|b:a或者b
A|asd:A或者asd
(cai)|(CA)I:cai或者CA
大部分跟正则表达式相同,有些只是去掉"\"反斜线逃。
正则表达式默认工作在贪婪模式下。
grep:是一个可以使用正则表达式搜索匹配的文本过滤工具,使用正则表达式可以做到匹配出很多“glob”匹配不出的内容。
grep [OPTIONS] PATTERN [FILE...] grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...] 选项: --color=auto: 对匹配到的文本着色显示; -v: 显示不能够被pattern匹配到的行; -i: 忽略字符大小写; -o: 仅显示匹配到的字符串; -q: 静默模式,不输出任何信息; -A #:after, 后#行 -B #: before, 前#行 -C #:context, 前后各#行 -E:使用ERE;
grep使用演示:
1、显示/proc/meminfo文件中以大小s开头的行;(要求:使用两种方式)
# grep -i "^s" /proc/meminfo # grep "^[Ss]" /proc/meminfo # grep "^S" /proc/meminfo && grep "^s" /proc/meminfo (感谢“N21-蓝”妹子的细心实验检查,这个答案是有问题的,各位可以看下有什么问题检验一下自己。)
2、显示/etc/passwd文件中不以/bin/bash结尾的行;
# grep -v "/bin/bash$" /etc/passwd
3、显示/etc/passwd文件中ID号最大的用户的用户名;
# sort -t: -k3 -n /etc/passwd | tail -1 | grep -o "^[[:alnum:]]\+\b" # sort -t: -k3 -n /etc/passwd | tail -1 | grep -o -E "^[[:alnum:]]+\b"
4、如果用户root存在,显示其默认的shell程序;
# id root &> /dev/null && grep "^root" /etc/passwd | cut -d: -f7
5、找出/etc/passwd中的两位或三位数;
# grep "\b[0-9]\{2,3\}\b" /etc/passwd # grep -E "\b[0-9]{2,3}\b" /etc/passwd
6、显示/etc/rc.d/rc.sysinit文件中,至少以一个空白字符开头的且后面存非空白字符的行;
# grep "^[[:space:]]\+[^[:space:]]\+" /etc/rc.d/rc.sysinit
7、找出"netstat -tan"命令的结果中以'LISTEN'后跟0、1或多个空白字符结尾的行;
# netstat -tan | grep --color "LISTEN[[:space:]]*"
8、添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行;
这题我使用bash脚本 #!/bin/bash id bash &> /dev/mull || useradd bash id testbash &> /dev/null || useradd testbash id basher &> /dev/null || useradd basher id nologin &> /dev/null || useradd -s /sbin/nologin nologin grep --color "^\(\b[[:alnum:]]\+\b\).*\1$" /etc/passwd #grep --color -E "^(\b[[:alnum:]]+\b).*\1$" /etc/passwd
1、显示当前系统root、centos或user1用户的默认shell和UID;
# grep -E '^(root|centos|user1)\>' /etc/passwd | cut -d: -f1,3,7
2、找出/etc/rc.d/init.d/functions文件(centos6)中某单词后面跟一个小括号的行;
# grep -E -o "^[_[:alpha:]]+\(\)" /etc/rc.d/init.d/functions
3、使用echo输出一绝对路径,使用egrep取出其基名;
# echo "/mnt/sdc" | grep -E -o "[^/]+/?$" | cut -d"/" -f1
4、找出ifconfig命令结果中1-255之间的数值;
# ifconfig | grep -E --color "\b[0-9]{1,2}\b|\b1[0-9]{1,2}\b|2[0-4][0-9]?|\b25[0-4]?"
5、找出ifconfig命令结果中的IP地址;
# ifconfig | grep -E --color "((\b[0-9]{1,2}\b|\b1[0-9]{1,2}\b|2[0-4][0-9]?|\b25[0-5]?)\b\.){3}(\b[0-9]{1,2}\b|\b1[0-9]{1,2}\b|2[0-4][0-9]?|\b25[0-5]?\b)"
原创文章,作者:N21_志建,如若转载,请注明出处:http://www.178linux.com/22226
评论列表(1条)
写的很好,排版还可以在漂亮一点,加油