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. 第十三届蓝桥杯大赛软件赛省赛【Java 大学B 组】试题D: 最少刷题数

    1 import java.util.ArrayList; 2 import java.util.Scanner; 3 4 public class Main { 5 public static vo ...

  2. C语言线程安全问题

    线程安全问题 #include <stdio.h> #include <tinycthread.h> #include <io_utils.h> int count ...

  3. #Kruskal,分治#AT4569 Connecting Cities

    题目传送门 考虑如何去掉这个绝对值, 换句话说,如何减少边数并且能建出 MST. 在求解偏序问题时,往往会分而治之, 这样原来 \(O(n^2)\) 的做法就能够被优化. 考虑将所有点对半折开, 左半 ...

  4. Java进行excel的导入导出操作

    excel表格的导出导入在业务中经常会遇到,下面介绍hutool和easyExcel两种操作excel的工具 测试的实体类 通过mybatis-plus生成的,用于导出数据的实体类 @Getter @ ...

  5. InnoDB常用锁总结(行锁、间隙锁、临键锁、表锁)

    相关文章 数据库系列:MySQL慢查询分析和性能优化 数据库系列:MySQL索引优化总结(综合版) 数据库系列:高并发下的数据字段变更 数据库系列:覆盖索引和规避回表 数据库系列:数据库高可用及无损扩 ...

  6. 如何将 ASP.NET Core MVC 项目的视图分离到另一个项目

    如何将 ASP.NET Core MVC 项目的视图分离到另一个项目 在当下这个年代 SPA 已是主流,人们早已忘记了 MVC 以及 Razor 的故事.但是在某些场景下 SSR 还是有意想不到效果. ...

  7. .NET开源免费的跨平台框架 - MAUI(附学习资料)

    前言 前几天分享了一个.NET MAUI开源免费的UI工具包 - Uranium,然后技术群有不少同学问.NET MAUI是不是免费的?能做什么?今天特意写这篇文章来介绍一下.NET开源.免费(基于M ...

  8. 力扣50(java)-Pow(x,n)(中等)

    题目: 实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即xn ). 示例 1: 输入:x = 2.00000, n = 10输出:1024.00000示例 2: 输入:x = 2.10 ...

  9. EMR重磅发布智能运维诊断系统(EMR Doctor)——开源大数据平台运维利器

    简介: E-MapReduce 推出面向开源大数据集群的智能运维诊断系统 E-MapReduce Doctor,有效提升大数据集群运维效率,辅助 EMR 用户完善集群监控体系. 大数据运维的挑战-如何 ...

  10. Lindorm-Operator云原生实践

    简介: Kubernetes 的CRD 机制(CustomResourceDefinition)支持通过自定义的controller来管理资源的生命周期,这样就可以像操作pod,deployment一 ...