1、grep

1. 什么是grep、egrep和fgrep

  1. Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来(匹配到的标红)。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

  2. grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。

  3. grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。

  4. egrep = grep -E:扩展的正则表达式 (除了\< , \> , \b 使用其他正则都可以去掉\)

  5. 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
google
gooogle
gooooogle
ggle
gogle
[root@centos7-1data]#grep "^google$" f1 #只筛选google的行
google
[root@centos7-1data]#grep -v "^$" f1 显示非空行
google
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及正则表达式的更多相关文章

  1. Linux文本处理三剑客之grep及正则表达式详解

    Linux文本处理三剑客之grep及正则表达式详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Linux文本处理三剑客概述 grep: 全称:"Global se ...

  2. 文本三剑客之grep的用法

    第1章         正则表达式 1.1    正则表达式的介绍               正则是用来过滤文件内容               为处理大量文本|字符串而定义的一套规则和方法.    ...

  3. 文本三剑客之grep

    接受正则表达式,按行匹配,将会过滤出匹配的所有行 格式: grep   [OPTION]...     PATTERN    [FILE]... 可以看出,grep后可以同时接多个文件 选项OPTIO ...

  4. linux文本三剑客之grep

    grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正 ...

  5. Linux 文本三剑客之 grep

    Linux 系统中一切皆文件. 文件是个文本.可以读.可以写,如果是二进制文件,还能执行. 在使用Linux的时候,大都是要和各式各样文件打交道.熟悉文本的读取.编辑.筛选就是linux系统管理员的必 ...

  6. Linux 三剑客之grep

    目录 Linux 三剑客之grep 搭配命令-find 三剑客之grep: 正则表达式: Linux 三剑客之grep 搭配命令-find find命令是根据文件的名称或者属性查找文件,并不会显示文件 ...

  7. 文本处理三剑客之grep&正则表达式

    grep是一个文本过滤工具,它支持正则表达式,能把搜索匹配到的行打印出来.grep的全称是Global Regular Expression Print(全局正则表达式)使用权限是所有用户. 一.gr ...

  8. Linux文本三剑客超详细教程---grep、sed、awk

    awk.grep.sed是linux操作文本的三大利器,合称文本三剑客,也是必须掌握的linux命令之一.三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂.grep更适合单 ...

  9. 文本处理三剑客之 grep

    grep简介 grep(Global search REgular expression and Print out the line)是Linux上的文本处理三剑客之一,另外两个是sed和awk. ...

随机推荐

  1. 第二十二章 集成验证码——《跟我学Shiro》

    目录贴:跟我学Shiro目录贴 在做用户登录功能时,很多时候都需要验证码支持,验证码的目的是为了防止机器人模拟真实用户登录而恶意访问,如暴力破解用户密码/恶意评论等.目前也有一些验证码比较简单,通过一 ...

  2. netstat -anp/ss -t里的Send-Q和Recv-Q含义

    Send-Q 对方没有收到的数据或者说没有Ack的,还在本地缓冲区 Recv-Q 数据已经在本地接收缓冲区,但是还没有recv() The count of bytes not copied by t ...

  3. linux一行命令查杀进程

    https://blog.csdn.net/primeprime/article/details/52415273 ps -efww | grep -w 'helloworld' | grep -v ...

  4. 【VS开发】【数据库开发】libevent入门

    花了两天的时间在libevent上,想总结下,就以写简单tutorial的方式吧,貌似没有一篇简单的说明,让人马上就能上手用的.首先给出官方文档吧: http://libevent.org ,首页有个 ...

  5. 2、1 昨天讲列表缓存,为了让列表更新,我们需要在增、删、改方法之前加 @CacheEvict(value="list",allEntries = true)

    package com.bw.service; import java.util.List; import javax.annotation.Resource; import org.springfr ...

  6. win10系统,jdk环境变量配置,编辑系统变量窗口显示旧版单行和新版列表问题

    大家好,今天说一下我在配置jdk环境变量时遇到的编辑系统变量窗口显示问题. 首先我们说一下如何配置jdk环境变量. 右击此电脑,点击属性. 跳出如下窗口,点击高级系统设置. 跳出如下窗口,点击环境变量 ...

  7. javaIO -- File源码

    一.简介 文件和目录路径名的抽象表示. 用户界面和操作系统使用依赖于系统的路径名字符串命名文件和目录. 这个类提供了一个抽象的,独立于系统的层次化路径名的视图. 二.代码 (一).属性详情 //平台的 ...

  8. Postman和jmeter的区别

    1.创建接口用例集(没区别) Postman是Collections,Jmeter是线程组,没什么区别. 2.步骤的实现(有区别) Postman和jmeter都是创建http请求 区别1:postm ...

  9. python-django-天天生鲜项目

    1 需求分析 github源码:https://www.github.com/wangyingchuang/dailyfresh 1.1  用户模块 1) 注册页 l  注册时校验用户名是否已被注册. ...

  10. css — 定位、背景图、水平垂直居中

    目录 1. 定位 2. 背景图 3. 水平垂直居中 1. 定位 position:static | relative | absolute | fixed; static 静态定位 relative ...