linux文本三剑客之grep及正则表达式详解



1. grep命令详解

grep命令用于过滤一行中的关键字,若匹配,则输出此行内容。

grep命令的语法格式如下:

grep [OPTION]... PATTERN [FILE]...
其中PATTERN为正则表达式,默认支持标准正则表达式

grep命令的常用选项如下:

选项 说明
-v 显示不被匹配到的行
-i 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配的次数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何内容
-w 匹配整个单词,而不仅是包含
-e 实现多个选项之间的逻辑或关系
-E 使用扩展的正则表达式
-A # 显示匹配到的行及本行之后#行
-B # 显示匹配到的行及本行之前#行
-C # 显示匹配到的行及本行前后#行
--color=auto 对匹配到的字符着色显示

grep的用法示例如下:

#示例一:grep常规用法
[root@xuzhichao ~]# grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin #实例二:显示行号
[root@xuzhichao ~]# grep -n "root" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin #示例三:显示包含关键字的行数
[root@xuzhichao ~]# grep -c "root" /etc/passwd
2 #示例四:逻辑或关系
[root@xuzhichao ~]# grep -e "root" -e "xu" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
xu:x:1000:1000:xu:/home/xu:/bin/bash #示例五:-w选项匹配整个单词
[root@xuzhichao ~]# echo "xabcy" | grep -w abc
[root@xuzhichao ~]# echo "x abc y" | grep -w abc
x abc y
[root@xuzhichao ~]# echo "x,abc,y" | grep -w abc
x,abc,y #示例六:-o选项表示只显示匹配到的内容
[root@xuzhichao ~]# echo "x,abc,y" | grep -o abc
abc
[root@xuzhichao ~]# echo "xabcy" | grep -o abc
abc #示例七:-A B C 的用法
[root@xuzhichao ~]# grep -n -A3 "root" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/nologin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
4-adm:x:3:4:adm:/var/adm:/sbin/nologin
--
10:operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13-nobody:x:99:99:Nobody:/:/sbin/nologin [root@xuzhichao ~]# grep -n -B3 "root" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
--
7-shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8-halt:x:7:0:halt:/sbin:/sbin/halt
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin [root@xuzhichao ~]# grep -n -C3 "root" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/nologin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
4-adm:x:3:4:adm:/var/adm:/sbin/nologin
--
7-shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8-halt:x:7:0:halt:/sbin:/sbin/halt
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
12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13-nobody:x:99:99:Nobody:/:/sbin/nologin #示例八:-q不输出内容,可以通过命令返回结果判断是否有内容
[root@xuzhichao ~]# grep -q "root" /etc/passwd
[root@xuzhichao ~]# echo $?
0

2. 正则表达式

正则表达式用于按照一定模式匹配字符串,分为基本正则表达式和扩展正则表达式。

2.1 基本正则表达式

基本真正表达式按照匹配的类型,可以分为以下几种:

  • 字符匹配

    元字符 说明
    . 匹配任意单个字符,当.放到[]中表示普通的.,不再有特殊意义
    [] 中括号匹配指定集合内的任意单个字符,[xu]代表x,u两个字符中的任意一个
    [0-9] 匹配任意数字
    [a-z] 匹配任意单个小写字母
    [:upper:] 匹配任意单个大写字母
    [:lower:] 匹配任意单个小写字母
    [:digit:] 匹配任意单个数字
    [:alnum:] 匹配任意单个所有字母和数字
    [:alpha:] 匹配任意单个大写和小写字母
    [:space:] 匹配单个空白字符
    [:punctl:] 匹配单个标点符号
    [^xu] 匹配除了x,u以外的其他单个字符
    [^a-z] 匹配除了小写字母以外的其他单个字符
  • 匹配次数

    元字符 说明
    * 匹配前面的字符任意次,包括0次
    .* 匹配任意长度的任意字符
    ? 匹配前面的字符0次或1次
    \+ 匹配前面的字符至少一次
    \ 匹配前面的字符n次
    \ 匹配前面的字符至少m次,最多n次
    \ 匹配前面的字符至多n次
    \ 匹配前面的字符至少n次
  • 位置锚定

    元字符 说明
    ^ 行首锚定
    $ 行尾锚定
    ^$ 匹配空行
    ^.*$ 匹配整行
    ^[[:space:]]*$ 匹配空白行
    \< 或 \b词首 词首锚定
    \> 或 \b词尾 词尾锚定

    注意:单词中只能有字母,数字,“-”符号,其余符号(:,。./)均为单词的分隔符。

  • 分组

    元字符 说明
    ( \) 将一个多多个字符捆绑到一起,当做一个整体处理。分组括号中的模式所匹配到的内容会记录与正则表达式内部变量中,变量名为\1,\2,\3,...,称为后项引用
    \1 表示从左侧起第一个左括号以及与之匹配的右括号之前的模式所匹配的字符
    \2 表示从左侧起第二个左括号以及与之匹配的右括号之前的模式所匹配的字符
    \| 表示“或”

    示例:

    • (string1\+\(string2\)*\),其中\1表示:string1\+\(string2\)*,\2表示string2;

    • a\|b 表示a或b;

    • C\|cat 表示C或cat;

    • \(C\|c\)at表示 Cat或cat;

  • 基本正则表达式的使用示例如下:

    #示例一:取接口ip地址
    [root@xuzhichao ~]# ifconfig eth0 | grep -o "inet [0-9.]\{7,15\}"
    inet 192.168.20.17
    [root@xuzhichao ~]# ifconfig eth0 | grep -o "inet [0-9.]\{7,15\}" | cut -d " " -f 2
    192.168.20.17 #示例二:位置锚定
    [root@xuzhichao ~]# grep "root" /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    admroot:x:1001:1001::/home/admroot:/bin/bash
    rooter:x:1002:1002::/home/rooter:/bin/bash
    [root@xuzhichao ~]# grep "\<root" /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    rooter:x:1002:1002::/home/rooter:/bin/bash
    [root@xuzhichao ~]# grep "\<root\>" /etc/passwd <==相当于-w选项
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin #示例三:找出passwd文件中首尾都是同一个单词的行
    [root@xuzhichao ~]# grep "^\(.*\):.*\1$" /etc/passwd
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt #示例四:判断centos的主版本号
    [root@xuzhichao ~]# cat /etc/redhat-release
    CentOS Linux release 7.8.2003 (Core)
    [root@xuzhichao ~]# grep -o " [0-9]\+" /etc/redhat-release
    7
    [root@xuzhichao ~]# grep -o " [0-9]\+" /etc/redhat-release | grep -o "[0-9]\+"
    7

2.2 扩展正则表达式

扩展正则表达式与基本正则表达式区别不多,仅仅是把\符号去掉了。

扩展正则表达式元字符意义如下:

  • 字符匹配

    元字符 说明
    . 匹配任意单个字符,当.放到[]中表示普通的.,不再有特殊意义
    [] 中括号匹配指定集合内的任意单个字符,[xu]代表x,u两个字符中的任意一个
    [0-9] 匹配任意数字
    [a-z] 匹配任意单个小写字母
    [:upper:] 匹配任意单个大写字母
    [:lower:] 匹配任意单个小写字母
    [:digit:] 匹配任意单个数字
    [:alnum:] 匹配任意单个所有字母和数字
    [:alpha:] 匹配任意单个大写和小写字母
    [:space:] 匹配单个空白字符
    [:punctl:] 匹配单个标点符号
    [^xu] 匹配除了x,u以外的其他单个字符
    [^a-z] 匹配除了小写字母以外的其他单个字符
  • 匹配次数

    元字符 说明
    * 匹配前面的字符任意次,包括0次
    .* 匹配任意长度的任意字符
    ? 匹配前面的字符0次或1次
    + 匹配前面的字符至少一次
    匹配前面的字符n次
    匹配前面的字符至少m次,最多n次
    匹配前面的字符至多n次
    匹配前面的字符至少n次
  • 位置锚定

    元字符 说明
    ^ 行首锚定
    $ 行尾锚定
    ^$ 匹配空行
    ^.*$ 匹配整行
    [1]*$ 匹配空白行
    \< 或 \b词首 词首锚定
    \> 或 \b词尾 词尾锚定

    注意:单词中只能有字母,数字,“-”符号,其余符号(:,。./)均为单词的分隔符。

  • 分组

    元字符 说明
    () 将一个多多个字符捆绑到一起,当做一个整体处理。分组括号中的模式所匹配到的内容会记录与正则表达式内部变量中,变量名为\1,\2,\3,...,称为后项引用
    \1 表示从左侧起第一个左括号以及与之匹配的右括号之前的模式所匹配的字符
    \2 表示从左侧起第二个左括号以及与之匹配的右括号之前的模式所匹配的字符
    | 表示“或”
  • 扩展正则表达式的使用示例如下:

    #示例一:查看/proc/meminfo下以大小写s开头的行
    [root@xuzhichao ~]# grep -E "^(s|S).*" /proc/meminfo
    [root@xuzhichao ~]# grep -e "^s.*" -e "^S.*" /proc/meminfo #示例二:显示/etc/passwd中的两位或三位数字
    [root@xuzhichao ~]# grep -E "\<[0-9]{2,3}\>" /etc/passwd #示例三:显示/etc/passwd文件中不以/bin/bash结尾的行
    [root@xuzhichao ~]# grep -v ".*/bin/bash$" /etc/passwd #示例四:查找/etc/grub2.cfg文件中,至少以一个空白字符开头且后面有非空白字符的行
    [root@xuzhichao ~]# grep -E "^[[:space:]]+[^[:space:]]+" /etc/grub2.cfg #示例五:取磁盘利用率,从大到小排序
    [root@xuzhichao ~]# df | grep "/dev/" | grep -Eo "[0-9]{1,3}%" | tr -d "%" | sort -rn #示例六:查找/etc/rc.d/init.d/functions文件中所有函数名,即以一个单词(包括_)开头,后面跟一个小括号的行
    [root@xuzhichao ~]# grep -E "^[[:alnum:]_]*\(\)" /etc/rc.d/init.d/functions #示例七:取/etc/rc.d/init.d/functions/的目录名
    [root@xuzhichao ~]# echo "/etc/rc.d/init.d/functions/" | grep -Eo "^.*/." | grep -Eo "^.*/"
    /etc/rc.d/init.d/ #示例八:取/etc/rc.d/init.d/functions/的文件名
    [root@xuzhichao ~]# echo "/etc/rc.d/init.d/functions/" | grep -Eo "[^/]*/?$"
    functions/ #示例九:精确匹配IP地址格式
    #IP地址一般包括0-9,10-99,100-199,200-249,250-255
    #0-255的正则表达式表示方法为([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])
    [root@xuzhichao ~]# ifconfig eth0 | grep -Eo "([0-9]\.|[1-9][0-9]\.|1[0-9][0-9]\.|2[0-4][0-9]\.|25[0-5]\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"
    192.168.20.17
    255.255.255.0
    192.168.20.255 #示例十:正则表达式匹配手机号
    [root@xuzhichao ~]# grep -Eo "\<1[3-9][0-9]{9}\>" #示例十一:正则表达式匹配邮箱
    #邮箱@前缀的几种类型:
    #1、纯数字   123456@qq.com
    #2、纯字母      zhangsan@qq.com
    #3、字母数字混合  zhang123@qq.com
    #4、带点的      zhang.san@qq.com
    #5、带下划线     zhang_san@qq.com
    #6、带连接线    zhang-san@qq.com
    #邮箱@后缀的类型:
    #1、123456@qq.com
    #2、123456@vip.qq.co
    #*至少有两处单词
    #*顶级域名一般为2~4位(如cn、com、club)
    #默认前缀、后缀不以'_'、'-'、'.'结尾,所以正则可以写成:
    [root@xuzhichao ~]# grep -E "^[[:alnum:]]+([-_.][[:alnum:]]+)*@([[:alnum:]]+[.-])+[[:alnum:]]{2,4}$"

  1. [:space:]

linux文本三剑客之grep及正则表达式详解的更多相关文章

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

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

  2. 文本三剑客之grep及正则表达式

    1.grep 1. 什么是grep.egrep和fgrep Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来(匹配到的标红).grep全称是Glo ...

  3. Linux 文本三剑客之 grep

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

  4. linux文本三剑客之grep

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

  5. grep与正则表达式详解和实例

    转载自:http://www.jb51.net/article/31207.htm grep 工具,以前介绍过. grep -[acinv] '搜索内容串' filename -a 以文本文件方式搜索 ...

  6. (转)linux正则表达式详解

    linux正则表达式详解 http://blog.csdn.net/wuliowen/article/details/64131815 1:什么是正则表达式: 简单的说,正则表达式就是处理字符串的方法 ...

  7. Linux 正则表达式详解

    正则表达式(REGULAR):为处理大量的字符串而定义的一套规则和方法,为了处理大量字符串而生 常见命令参数 基础正则表达式 . :有且只有任意一个字符(包括空格) * :重复前面任意0或者多个字符 ...

  8. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  9. Java 正则表达式详解_正则表达式

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  10. Linux网络状态工具ss命令使用详解【转】

    ss命令用于显示socket状态. 他可以显示PACKET sockets, TCP sockets, UDP sockets, DCCP sockets, RAW sockets, Unix dom ...

随机推荐

  1. Finereport11 类Excel筛选

    微信公众号:次世代数据技术 关注可了解更多的教程.问题或建议,请公众号留言或联系本人; 微信号:weibw162 本教程视频讲解可以关注本人B站账号进行观看:weibw162 一.需求描述 在使用FI ...

  2. Python 基于 xlsxwriter 实现百万数据导出 excel

    追加导出 + 自动切换 sheet ️ excel 中的每个 sheet 最多只能保存 1048576 行数据 # 获取项目的根路径 rootPath curPath = os.path.abspat ...

  3. C++ 自动计时

    #include<iostream> #include<chrono> struct Timer { std::chrono::time_point<std::chron ...

  4. 一文搞懂Java的工具类和API

    1.工具类(Utility Class) 在Java中,工具类通常包含一系列静态方法,用于执行常见的任务,这些任务可能不直接关联到特定的业务逻辑,而是用于处理一些基础的数据转换.字符串操作.文件操作等 ...

  5. JDK9的新特性:String压缩和字符编码

    目录 简介 底层实现 总结 简介 String的底层存储是什么?相信大部分人都会说是数组.如果要是再问一句,那么是以什么数组来存储呢?相信不同的人有不同的答案. 在JDK9之前,String的底层存储 ...

  6. Git分支教程:详解分支创建、合并、删除等操作

    Git是一种强大的分布式版本控制系统,它的分支功能使得团队协作和代码管理变得更加灵活和高效.分支可以让开发人员在不影响主线开发的情况下进行并行开发和实验性工作.本篇博客将详解Git分支的创建.合并.删 ...

  7. SQL CREATE INDEX 语句- 提高数据库检索效率的关键步骤

    SQL CREATE INDEX 语句 SQL CREATE INDEX 语句用于在表中创建索引. 索引用于比其他方式更快地从数据库中检索数据.用户无法看到索引,它们只是用于加速搜索/查询. 注意: ...

  8. Qt数据结构-QString一:常用方法

    一.拼接字符串 拼接字符串有两种方法: +=  .  append QString s; s = "hello"; s = s + " "; s += &quo ...

  9. 什么是报表工具?和 EXCEL 有什么区别?

    报表是什么? 带数据的表格和图表就都是报表,像工资表,考勤表,成绩表,资产负载表等等都是报表. 那报表工具,顾名思义就是用来做报表的工具,那 Excel 是不是也算报表工具?广义上讲当然也算.但 IT ...

  10. sql 语句系列(字符串之裂开)[八百章之第十三章]

    创建分割列表 一张表: 先查询出来的效果是这样的: mysql: select emp_copy.deptno,GROUP_CONCAT(emp_copy.emps SEPARATOR ',') fr ...