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. 自己写个网盘系列:③ 开源这个网盘编码,手把手教你windows linux 直接部署,docker本地打包部署网盘应用

    系列①②已经完成了这个项目的页面和项目的全部编码,前后端分离,这个文章将向你展示运维小伙伴如何部署到windows服务器,linux服务器,docker部署,一学就会,快来看看吧! 说明:这个系列准备 ...

  2. 如何保证MySQL和Redis数据一致性?

    背景 在高并发的业务场景中,因为MySQL数据库是操作磁盘效率比较低,因此大多数情况下数据库都是高并发系统的瓶颈.因为Redis操作数据是在内存中进行,所以就需要使用Redis做一个缓存.让请求先访问 ...

  3. #笛卡尔树,构造#洛谷 7726 天体探测仪(Astral Detector)

    题目传送门 分析 考虑每个数字一定会影响一定的范围, 那么可以记录每个数影响的最长区间和产生的个数, 那么通过这个可以解方程求出对于这个最长区间这个数的所在位置, 可以发现它可以满足一个树形结构,直接 ...

  4. #二分图匹配#UVA1194 Machine Schedule

    题目 有两台机器 \(A,B\) 分别有 \(n,m\) 种模式. 现在有 \(k\) 个任务.对于每个任务 \(i\) ,给定两个整数 \(a_i\) 和 \(b_i\)​, 表示如果该任务在 \( ...

  5. #搜索,容斥#洛谷 2567 [SCOI2010]幸运数字

    题目 问区间\([l,r],l,r\leq 10^{10}\)中有多少个数是 数位由6或8组成的数的倍数(包括本身) 分析 数位由6或8组成的数最多有两千多种, 这可以直接一遍暴搜得到 对于区间\([ ...

  6. OpenHarmony创新赛|赋能直播第三期

     开放原子开源大赛OpenHarmony创新赛赋能直播间持续邀请众多技术专家一起分享应用开发技术知识,本期推出OpenHarmony应用开发之音视频播放器和三方库的使用和方法,助力开发者掌握多媒体应用 ...

  7. MySQL 8.0字符集校正

    MySQL升级为8.0版本时,之前版本的字符集往往是不同的,需要校正. 执行下面的三个SQL语句的查询结果,可以从库.表.列三个层面对字符集进行校正. 库 select concat('alter d ...

  8. HarmonyOS音视频开发概述

      在音视频开发指导中,将介绍各种涉及音频.视频播放或录制功能场景的开发方式,指导开发者如何使用系统提供的音视频API实现对应功能.比如使用TonePlayer实现简单的提示音,当设备接收到新消息时, ...

  9. Linux之openssl实现私有CA

    一.简介 Centos7.9通过openssl工具构建一个私有的CA,用于颁发证书. 验证私有CA为httpd应用签署证书 二.构建私有CA 1.编辑CA的配置文件 [root@HLWHOST tls ...

  10. 面试官:实战中用过CountDownLatch吗?详细说一说,我:啊这

    写在开头 在很多的面经中都看到过提问 CountDownLatch 的问题,正好我们最近也在梳理学习AQS(抽象队列同步器),而CountDownLatch又是其中典型的代表,我们今天就继续来学一下这 ...