文本三剑客之grep及正则表达式
1、grep
1. 什么是grep、egrep和fgrep
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来(匹配到的标红)。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。
grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。
egrep = grep -E:扩展的正则表达式 (除了\< , \> , \b 使用其他正则都可以去掉\)
fgrep=grep -F:不支持正则表达式,可以过滤普通的字符串
作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行
模式:由正则表达式字符及文本字符所编写的过滤条件
用法:grep [OPTIONS] PATTERN [FILE...]
选项:
--color=auto: 对匹配到的文本着色显示
-v: 显示不被pattern匹配到的行
-i: 忽略字符大小写
-n:显示匹配的行号
-c: 统计匹配的行数
-o: 仅显示匹配到的字符串
-q: 静默模式,不输出任何信息
-A #: after, 后#行
-B #: before, 前#行
-C #:context, 前后各#行
-e:实现多个选项间的逻辑or关系
grep –e ‘cat ’ -e ‘dog’ file
-w:匹配整个单词
-E:使用ERE
-F:相当于fgrep,不支持正则表达式
-f file: 根据模式文件处理
2. grep实战演示
示例一:
将磁盘利用率进行倒序排序:
[root@ansibledata]#df | grep /dev/sd |tr -s " " % |cut -d% -f5 |sort -nr
17
5
1
示例二:
[root@ansibledata]#cat /etc/passwd | grep -nA1 root #过滤root的后一行
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/nologin
--
10:operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
[root@ansibledata]#cat /etc/passwd | grep -nB1 root #过滤root的前一行
1:root:x:0:0:root:/root:/bin/bash
--
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
[root@ansibledata]#cat /etc/passwd | grep -nC1 root #过滤root的前后一行
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/nologin
--
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
示例三:
[root@ansibledata]#grep -e root -e wang /etc/passwd 包含wang或者root的用户
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
wang:x:1001:1001::/home/wang:/bin/bash
示例四:
[root@ansibledata]#grep root /etc/passwd | grep bash 包括root并且包括bash的行
root:x:0:0:root:/root:/bin/bash
示例五:
[root@ansibledata]#grep -v root /etc/passwd 显示除了root的字符
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
示例六:
取出字符串内的交集:
[root@ansibledata]#grep -f f1 f2
aa
ccc
[root@ansibledata]#cat f1
aa
bbb
ccc
ee
[root@ansibledata]#cat f2
aa
ss
ccc
2、正则表达式
1、REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能
2、程序支持:grep,sed,awk,vim, less,nginx,varnish等
3、分两类:
4、基本正则表达式:BRE
5、扩展正则表达式:ERE
grep -E, egrep
6、正则表达式引擎:
采用不同算法,检查处理正则表达式的软件模块PCRE(Perl Compatible Regular Expressions)
元字符分类:字符匹配、匹配次数、位置锚定、分组
man 7 regex
基本正则表达式元字符
. 匹配任意单个字符
[] 匹配指定范围内的任意单个字符,示例:[wang] [0-9] [a-z] [a-zA-Z]
[^] 匹配指定范围外的任意单个字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母 [:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字 [:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
实战演练:
(1). 匹配任意单个字符
[root@centos7-1~]#grep r..t /etc/passwd 匹配r后面跟的两个任意字符
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@centos7-1~]#grep home. /etc/passwd 匹配home后面跟一个任意字符
liu:x:1000:1000:liu:/home/liu:/bin/bash
wang:x:1001:1001::/home/wang:/bin/bash
(2)[ ] 匹配指定范围内的任意单个字符 示例:[wang] [0-9] [a-z] [a-zA-Z]
[root@centos7-1~]#grep [wang] /etc/passwd
(3)[^] 匹配指定范围外的任意单个字符
grep [^0-9] /etc/fstab 匹配当前配置文件非数字的信息
(4)ifconfig ens33 | grep netmask | grep [[:digit:].] 匹配数字和.的内容
注意:[ .]在中括号里边的点就是一个点,在[ ].的点就是匹配任意一个字符。
匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数
* 匹配前面的字符任意次,包括0次
贪婪模式:尽可能长的匹配
.* 任意长度的任意字符
\? 匹配其前面的字符0或1次
\+ 匹配其前面的字符至少1次
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次
(1)* 匹配前面的字符任意次,包括0次
贪婪模式:尽可能长的匹配
(2).* 任意长度的任意字符
(3).* 任意长度的任意字符
grep "go.*gle" f1 匹配一次以上的o字母
grep "g.*gle" f1 匹配一次以上的g字母开头的字符
(4)\? 匹配其前面的字符0或1次
(5)\+ 匹配其前面的字符至少1次
(6)取出IP地址:
ifconfig ens33 | grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" | head -n1
位置锚定:定位出现的位置
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或 \b 词首锚定,用于单词模式的左侧
\> 或 \b 词尾锚定,用于单词模式的右侧
\<PATTERN\> 匹配整个单词
(1)^ 行首锚定,用于模式的最左侧
(2)$ 行尾锚定,用于模式的最右侧
[root@centos7-1data]#grep "bash$" /etc/passwd #以bash结尾的行
root:x:0:0:root:/root:/bin/bash
liu:x:1000:1000:liu:/home/liu:/bin/bash
wang:x:1001:1001::/home/wang:/bin/bash
[root@centos7-1data]#grep "^root" /etc/passwd #以root开头的行
root:x:0:0:root:/root:/bin/bash
[root@centos7-1data]#cat f1
gooogle
gooooogle
ggle
gogle
[root@centos7-1data]#grep "^google$" f1 #只筛选google的行
[root@centos7-1data]#grep -v "^$" f1 显示非空行
gooogle
gooooogle
ggle
gogle
grep -v "^#" /etc/fstab 显示非#开头的行
(3)\< 或 \b 词首锚定,用于单词模式的左侧
(4)\> 或 \b 词尾锚定,用于单词模式的右侧
(5)\<PATTERN\> 匹配整个单词
什么是单词的分隔符?
答曰:不能是数字、字母、下划线,其他的都可以。
[root@centos7-1data]#grep "root\>" /etc/passwd 以root为结尾的单词
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@centos7-1data]#grep "\<root" /etc/passwd 以root为开头的单词
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
分组和后向引用
(1)格式
① 分组:\(\) 将一个或多个字符捆绑在一起,当作一个整体进行处理
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ...
② 后向引用
引用前面的分组括号中的模式所匹配字符,而非模式本身
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
\2 表示从左侧起第2个左括号以及与之匹配右括号之间的模式所匹配到的字符,以此类推
\& 表示前面的分组中所有字符
③ 流程分析如下:
(2)或者:\|
[root@centos7-1data]#grep "\(abc\)\{3\}" f2 #表示匹配3次abc
abcabcabc
[root@centos7-1data]#cat > f2
xyz xyz
abc xyz abc xyz
abc xyz xyz abc
^C
[root@centos7-1data]#grep "\(abc\).*\(xyz\).*\1" f2 #含义是匹配以abc和xyz中间的内容,最后以abc结尾的行
abc xyz abc xyz
abc xyz xyz abc
[root@centos7-1data]#grep "\(abc\).*\(xyz\).*\2" f2 # 含义是匹配以abc至xyz中间的内容,最后以xyz结尾的行
abc xyz abc xyz
abc xyz xyz abc
grep "^\(a\|b\)" /etc/passwd 取出a或b开头的行
ifconfig ens33 | grep -o "\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}" 取出IP地址,前面的括号分组是第一个IP. {3}是将此IP重复3次,最后[0-9]\{1,3\} 是最后一次的IP地址
3、扩展正则表达式:
(1)字符匹配:
- . 任意单个字符
- [] 指定范围的字符
- [^] 不在指定范围的字符
- 次数匹配:
- * :匹配前面字符任意次
- ? : 0 或1次
- + :1 次或多次
- {m} :匹配m次 次
- {m,n} :至少m ,至多n次
(2)位置锚定:
- ^ : 行首
- $ : 行尾
- \<, \b : 语首
- \>, \b : 语尾
- 分组:()
- 后向引用:\1, \2, ...
- 或者:
a|b a或b
C|cat C或cat
(C|c)at Cat或cat
(3)总结
除了\<, \b : 语首、\>, \b : 语尾;使用其他正则都可以去掉\。
实战演示:
(1)显示基名
[root@centos7-1data]#echo "/etc/rc.d/init.d/function" | grep -oE "[^/]+$"
function
(2)显示目录名:两次的grep为了处理两次/
[root@centos7-1data]#echo "/etc/rc.d/init.d/function/" | grep -oE ".*[^/]" | grep -Eo ".*/"
/etc/rc.d/init.d/
(3)筛选出所有的IP地址
[root@centos7-1data]#ifconfig | grep -Eo "(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
192.168.34.102
255.255.255.0
192.168.34.255
192.168.34.117
255.255.255.0
192.168.34.255
127.0.0.1
255.0.0.0
192.168.122.1
255.255.255.0
192.168.122.255
文本三剑客之grep及正则表达式的更多相关文章
- Linux文本处理三剑客之grep及正则表达式详解
Linux文本处理三剑客之grep及正则表达式详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Linux文本处理三剑客概述 grep: 全称:"Global se ...
- 文本三剑客之grep的用法
第1章 正则表达式 1.1 正则表达式的介绍 正则是用来过滤文件内容 为处理大量文本|字符串而定义的一套规则和方法. ...
- 文本三剑客之grep
接受正则表达式,按行匹配,将会过滤出匹配的所有行 格式: grep [OPTION]... PATTERN [FILE]... 可以看出,grep后可以同时接多个文件 选项OPTIO ...
- linux文本三剑客之grep
grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正 ...
- Linux 文本三剑客之 grep
Linux 系统中一切皆文件. 文件是个文本.可以读.可以写,如果是二进制文件,还能执行. 在使用Linux的时候,大都是要和各式各样文件打交道.熟悉文本的读取.编辑.筛选就是linux系统管理员的必 ...
- Linux 三剑客之grep
目录 Linux 三剑客之grep 搭配命令-find 三剑客之grep: 正则表达式: Linux 三剑客之grep 搭配命令-find find命令是根据文件的名称或者属性查找文件,并不会显示文件 ...
- 文本处理三剑客之grep&正则表达式
grep是一个文本过滤工具,它支持正则表达式,能把搜索匹配到的行打印出来.grep的全称是Global Regular Expression Print(全局正则表达式)使用权限是所有用户. 一.gr ...
- Linux文本三剑客超详细教程---grep、sed、awk
awk.grep.sed是linux操作文本的三大利器,合称文本三剑客,也是必须掌握的linux命令之一.三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂.grep更适合单 ...
- 文本处理三剑客之 grep
grep简介 grep(Global search REgular expression and Print out the line)是Linux上的文本处理三剑客之一,另外两个是sed和awk. ...
随机推荐
- ubuntu18.04中将刚下载解压的eclipse添加到启动器
在/usr/share/applications/目录下新建一个名为eclipse.desktop的文件. 文件内容如下: [Desktop Entry] Version=2018.09 Name=E ...
- 【opencv】split
opencv-split Divides a multi-channel array into several single-channel arrays. code ,,,,,,,,,,,}; Ma ...
- 十六章 综合实例——《跟我学Shiro》
目录贴:跟我学Shiro目录贴 简单的实体关系图 简单数据字典 用户(sys_user) 名称 类型 长度 描述 id bigint 编号 主键 username varchar 100 用户名 pa ...
- MySQL数据同步交换
一.为了解决数据同步汇聚,数据分发,数据转换,数据维护等需求,TreeSoft将复杂的网状的同步链路变成了星型数据链路. TreeSoft作为中间传输载体负责连接各种数据源,为各种异构数据库之 ...
- numpy 构建深度神经网络来识别图片中是否有猫
目录 1 构建数据 2 随机初始化数据 3 前向传播 4 计算损失 5 反向传播 6 更新参数 7 构建模型 8 预测 9 开始训练 10 进行预测 11 以图片的形式展示预测后的结果 搭建简单神经网 ...
- web系统整体优化
关于web系统整体优化提速总结 关于web系统整体优化提速总结 一.背景 随着公司业务的拓展,随之而来就是各种系统横向和纵向的增加,PV.UV也都随之增加,原有的系统架构和模式慢慢遇上了瓶颈,需要 ...
- 25.Spark下载源码和安装和使用
安装scala 上传安装包 解压 配置scala相关的环境变量 export SCALA_HOME=/opt/modules/scala-2.11.4 export PATH=$PATH:$SCALA ...
- 解决RabbitMQ消息丢失问题和保证消息可靠性(一)
原文链接(作者一个人):https://juejin.im/post/5d468591f265da03b810427e 工作中经常用到消息中间件来解决系统间的解耦问题或者高并发消峰问题,但是消息的可靠 ...
- ARTS 第十周打卡
Algorithm : 做一个 leetcode 的算法题 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: [&quo ...
- 20191011-构建我们公司自己的自动化接口测试框架-Action的request方法封装
Action模块 封装接口request方法,根据传入的参数调用不同的请求方法,因为项目特色,我们公司的接口都是get和post方法,所以仅仅封装了get和post方法: import request ...