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. IDEA MyBatis Log 插件,打印SQL语句

    打开Settings->plugins 搜索插件 MyBatis Log点击安装,完成后重启IDEA即可. 点击Tools,选择 MyBatis Log Plugin ,会在下方打开一个窗口,这 ...

  2. Java开发岗面试题小结

    8种基本数据类型 类型名称 关键字 占用内存 取值范围 字节型 byte 1 字节 -128~127 短整型 short 2 字节 -32768~32767 整型 int 4 字节 -21474836 ...

  3. 企业数据清洗项目实践day1

    今天先把国标excel表的数据在Python里转化成了字典类型, 暂时定共分为四层,层层分类. 代码 1 def std_excel(): 2 dict={"A":{"0 ...

  4. #基数排序#CF1654F Minimal String Xoration

    题目传送门 分析 有没有一种办法可以将每个 \(j\) 的比较过程同时进行, 可以发现其实这个过程很像后缀排序,实际上只是加号变成了异或, 从低位到高位重新将字符串排名,用同样的方法做到 \(O(2^ ...

  5. #计数,记忆化搜索#C 连边方案

    分析 设\(dp[i][j][k][l]\)表示处理到\([i-l+1,i]\)的连边,二进制状态(奇点还是偶点)为\(k\)的方案数, 最后一维是为了避免算重,那么如果第\(i-l+1\)位是偶点可 ...

  6. 深入理解 Java 方法重载与递归应用

    Java 方法重载 方法重载 允许在同一个类中定义多个具有相同名称的方法,但 参数列表 必须不同. 语法: returnType methodName(parameter1, parameter2, ...

  7. CondeseNetV2:清华与华为出品,保持特征的新鲜是特征复用的关键 | CVPR 2021

    论文提出SFR模块,直接重新激活一组浅层特征来提升其在后续层的复用效率,而且整个重激活模式可端到端学习.由于重激活的稀疏性,额外引入的计算量非常小.从实验结果来看,基于SFR模块提出的CondeseN ...

  8. 【#HDC2022】HarmonyOS体验官活动正式开启,赶快投稿赢限量奖品吧!

      1. [活动简介] HDC 2022 于11月4日线上线下正式开启.历时一年,在无数开发者的共同努力下,我们汇聚了HarmonyOS生态的新成果.新体验.新开放能力,邀你参与到HarmonyOS的 ...

  9. 结构化数据上的 TopN 运算

    1.     最大值 / 最小值 最大值 / 最小值可以理解为 TopN 查询中,N 等于 1 时的情况,因为很常用所以单独拿出来讲一下.取最大值 / 最小值是很常见的需求,例如一班数学最高分是多少, ...

  10. k8s 深入篇———— 一些容器操作的原理[三]

    前言 简单介绍一下一些容器的操作原理. 正文 docker exec 是怎么做到进入容器里的呢. 比如说: 这里有一个容器,我们可以exec 进去: docker exec -it b265 /bin ...