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. RSA进阶(一)

    本篇为RSA进阶篇,继RSA入门 [RSA3]P1(扩展欧几里得) 题目 from Crypto.Util.number import * flag = b'******' m1 = bytes_to ...

  2. #线段树#LOJ 6029「雅礼集训 2017 Day1」市场

    题目 在长度为\(n(n\leq 10^5)\)的数列中, 需要满足区间加,区间下取整的操作 以及能够查询区间和以及区间最小值 除数\(d\)满足\(2\leq d\leq 10^9\) 加数\(c\ ...

  3. #线段树分治,线性基,并查集#CF938G Shortest Path Queries

    题目 给出一个连通带权无向图,边有边权,要求支持 \(q\) 个操作: \(x\) \(y\) \(d\) 在原图中加入一条 \(x\) 到 \(y\) 权值为 \(b\) 的边 \(x\) \(y\ ...

  4. #SG函数#HDU 1848 Fibonacci again and again

    题目 分析 可取状态只能是斐波那契数,求出SG函数 然后判断三个数sg函数异或和不为0先手必胜 代码 #include <cstdio> #include <cctype> # ...

  5. 使用OHOS SDK构建freetype

    参照OHOS IDE和SDK的安装方法配置好开发环境. 从github下载源码. 执行如下命令: git clone https://github.com/freetype/freetype.git ...

  6. Qt线程简单使用一:QThread~创建线程类子类

      需求: 点击QPushButton按钮,QLabel中的数字,不断累加,一直到999.   做法: 点击QPushButton后,启动线程,线程while循环,不断发送累加的数字回主线程,修改QL ...

  7. Qt调用摄像头二,Pro版

    本示例,为纯Qt调用摄像头,功能会比版本一要多一点:打开摄像头,设置参数,完整拍照,框选拍照,切换分辨率,旋转,水平镜像,垂直镜像,放大,缩小 上一个版本,使用的显示窗口直接显示出摄像头画面,所以可操 ...

  8. openGauss系统函数添加指导

    openGauss 系统函数添加指导 1.函数架构简介 openGauss 内函数的可以分为两个部分: ​ 身份注册声明:openGauss 中存在一个系统表 pg_proc,这个表存放了所有函数的基 ...

  9. openGauss资源池化开发者入门指南(二)

    openGauss 资源池化开发者入门指南(二) 一.内容简介 openGauss 资源池化是 openGauss 推出的一种新型的集群架构.通过 DMS 和 DSS 组件,实现集群中多个节点的底层存 ...

  10. Java面试题总结:基础及语法篇169道

    下载链接:https://gitee.com/ItBoShao/wechat_applet/blob/master/Java面试题总结:基础及语法篇169道.pdf