博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
grep和egrep正则表达式
阅读量:5071 次
发布时间:2019-06-12

本文共 3011 字,大约阅读时间需要 10 分钟。

 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表达式做为单词的行  

 

 分组及引用

\(\):将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 "\

 

 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表达式做为单词的行   

 

 分组及引用

():括号内模式会被记录于正则表达式引擎中:后向引用:\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 "[^/]+/?$"

转载于:https://www.cnblogs.com/python-gm/p/6940756.html

你可能感兴趣的文章
深入浅出理解zend framework(三)
查看>>
python语句----->if语句,while语句,for循环
查看>>
javascript之数组操作
查看>>
LinkedList源码分析
查看>>
TF-IDF原理
查看>>
用JS制作博客页面背景随滚动渐变的效果
查看>>
JavaScript的迭代函数与迭代函数的实现
查看>>
一步步教你学会browserify
查看>>
Jmeter入门实例
查看>>
亲近用户—回归本质
查看>>
中文脏话识别的解决方案
查看>>
CSS之不常用但重要的样式总结
查看>>
Python编译错误总结
查看>>
URL编码与解码
查看>>
日常开发时遇到的一些坑(三)
查看>>
Eclipse 安装SVN插件
查看>>
深度学习
查看>>
TCP粘包问题及解决方案
查看>>
构建之法阅读笔记02
查看>>
添加按钮
查看>>