grep和egrep正则表达式
Linux上文本处理三剑客
- grep :文本过滤( 模式:pattern) 工具
- grep, egrep, fgrep (不支持正则表达式搜索,但搜索纯文本的数据最快)
- sed :stream editor ,文本编辑工具
- awk :Linux上实际是gawk(GUN awk) ,文本报告生成器
正则表达式:
- 由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能
- 支持正则表达式的程序:grep, vim, less,nginx等
正则表达式分两类:
- 基本正则表达式:BRE
grep ,egrep -G
- 扩展正则表达式:ERE
grep -E, egrep
正则表达式引擎:
- 采用不同算法,检查处理正则表达式的软件模块
- PCRE(Perl Compatible Regular Expressions)
- 元字符分类:字符匹配、匹配次数、位置锚定、分组
grep
grep: Global search REgular expression and Print out the line.
作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行; 模式:由正则表达式字符及文本字符所编写的过滤条件
grep [OPTIONS] PATTERN [FILE...] grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
--color=auto: 对匹配到的文本着色显示; -v: 显示不能够被pattern匹配到的行; -i: 忽略字符大小写 -n:显示匹配的行号 -c: 统计匹配的行数,而不显示匹配到的内容 -o: 仅显示匹配到的字符串; -q: 静默模式,不输出任何信息 -A #:after,显示匹配的行及其后#行 -B #: before,显示匹配的行及其前#行 -C #:context,显示匹配的行及其前后各#行 -e:实现多个选项间的逻辑or关系
grep –e 'cat' -e 'dog' file
-E:使用ERE 扩展的正则表达式
基本正则表达式元字符:
字符匹配:
.: 匹配任意单个字符; []: 匹配指定范围内的任意单个字符 [^]:匹配指定范围外的任意单个字符 [:digit:] [:lower:] [:upper:] [:alpha:] [:alnum:] [:punct:] [:space:]
匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数,默认工作在贪婪模式:尽可能长的匹配
* :匹配前面的字符任意次,包括0次 .* :任意长度的任意字符 \? :匹配其前面的字符0或1次 \+ :匹配其前面的字符至少1次,但不需要紧随在第一次后面 \{m\} :匹配前面的字符m次 \{m,n\} :匹配前面的字符至少m次,至多n次 \{,n\} :匹配前面的字符至多n次 <=n次 \{m,\} :匹配前面的字符至少m次 >=m次
位置锚定:定位出现的位置
^ :行首锚定,用于模式的最左侧 $ :行尾锚定,用于模式的最右侧 ^PATTERN$: 用于模式匹配整行 ^$: 空行 ^[[:space:]]*$ :空白行或包含tab字符的行 \< 或 \b :词首锚定,用于单词模式的左侧 \> 或 \b :词尾锚定;用于单词模式的右侧 注意:在grep中,字母和数字的组合也被视为单词 \<PATTERN\>:锚定以PATTERN表达式做为单词的行
分组及引用
\(\):将1个或多个字符捆绑在一起作为一个整体进行处理 \(xy\)*ab:xy作为一个整体出现0此或多次 注意:分组括号中的模式匹配到的内容会被正则表达式引擎记录与内部变量中,这些变量为: \1:模式从左侧起,第一个左括号以及与其匹配的右括号之间的内容 \2:模式从左侧起,第二个左括号以及与其匹配的右括号之间的内容 \3: …… 后向引用:引用前面的分组括号中的模式所匹配的字符,且引用中的数据和分组模式匹配到的数据是一样
练习:
1、显示/etc/passwd 文件中不以/bin/bash 结尾的行
# grep -v "/bin/bash$" /etc/passwd
2 、显示用户rpc 默认的shell 程序
# grep "^rpc\>" /etc/passwd | cut -d: -f7
3 、找出/etc/passwd 中的两位或三位数
# grep -E "\<[0-9]{2,3}\>" /etc/passwd
4 、找出"netstat -tan" 命令的结果中以'LISTEN' 后跟0 、1或多个空白字符结尾的行
# netstat -tan | grep "\<LISTEN[[:space:]]*$"
egrep及扩展的正则表达式
egrep = grep -E
egrep [OPTIONS] PATTERN [FILE...]
选项:
-i,-o,-v,q,-A,-B,-C
-G:支持基本的正则表达式
扩展正则表达式元字符:
字符匹配:
.: 匹配任意单个字符; []: 匹配指定范围内的任意单个字符 [^]:匹配指定范围外的任意单个字符 [:digit:] [:lower:] [:upper:] [:alpha:] [:alnum:] [:punct:] [:space:]
匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数,默认工作在贪婪模式,尽可能长的匹配
* :匹配前面的字符任意次,包括0次 .* :任意长度的任意字符 ? :匹配其前面的字符0或1次 + :匹配其前面的字符至少1次 {m} :匹配前面的字符m次 {m,n} :匹配前面的字符至少m次,至多n次 {,n} :匹配前面的字符至多n次 <=n次 {m,} :匹配前面的字符至少m次 >=m次
位置锚定:定位出现的位置
^ :行首锚定 $ :行尾锚定 ^PATTERN$: 用于模式匹配整行 ^$: 空行 ^[[:space:]]*$ :空白行或包含tab字符的行 \< 或 \b :词首锚定 \> 或 \b :词尾锚定 注意:在grep中,字母和数字的组合也被视为单词 \<PATTERN\>:锚定以PATTERN表达式做为单词的行
分组及引用
():括号内模式会被记录于正则表达式引擎中: 后向引用:\1,\2,\3...... 或者 a|b:a或者b eg:C|cat :表示C或者cat (C|c)at :表示Cat或者cat
练习:
1 、显示当前系统上,root,gao和user1用户的相关信息
# grep -E "\<(root|gao|uer1)\>" /etc/passwd
2 、统计以root 身份登录的每个远程主机IP
# who | grep -E "^root\>" | wc -l
3 、使用egrep 取出/etc/rc.d/init.d/functions
# echo "/etc/rc.d/init.d/functions" | grep -oE "[^/]+/?$"