0x00 正则表达式概述

正则表达式是描述一些字符串的模式,是由一些元字符和字符组成的字符串,而这些元字符是一些表示特殊意义的字符,即被正则表达式引擎表达的字符表示与其本意不同的一些字符。

0x01 正则表达式的分类

基本正则表达式
扩展正则表达式

# 这两种分类其支持的元字符不同;

0x02 基本正则表达式的元字符

1、匹配字符:

.: 匹配任意单个字符
[]: 匹配范围内的任意单个字符
[^]: 匹配范围外的任意单个字符
[:space:]: 空格
[:upper:]: 大写字母
[:lower:]: 小写字母
[:alpha:]: 所有字母
[:alnum:]: 所有的数字和字母
[:digit:]: 所有的数字
[:punct:]: 所有的标点符号

2、匹配个数:

*: 匹配其前字符任意次(包括0次)
\?: 匹配其前字符0或1次,即至多一次
\+: 匹配其前字符1次或多次,即至少一次
\{m\}: 匹配其前字符m次
\{m,n\}: 匹配其前字符至少m次,至多n次
\{0,n\}: 匹配其前字符至多n次
\{m,\}: 匹配其前字符至少m次

3、位置锚定:

^: 行首锚定
$: 行尾锚定
^PATTERN$: 用于PATTERN来匹配整行
^$: 空白行
^[[:space:]]*$: 空行或包含空白字符的行
单词:非特殊字符组成的连续字符(字符串)都称为单词
\<或\b: 词首锚定
\>或\b: 词尾锚定
\<PATTERN\>: 匹配完整单词

4、分组及引用:

\(\): 将括号内的内容作为一个整体进行匹配
正则表达式引擎会从左第一个左括号对应括号的分组匹配到的内容保存至变量\1中,第二个左括号中匹配到的内容保存至变量\2中,以此类推;
引用:引用是在一个正则表达式当中有可能出现要使用前面分组中所匹配到的内容,而每次分组中匹配到的内容可能不相同,此时要和分组中匹配的内容相同的话就得使用引用。利用\1,\2变量来引用前面对应括号内的PATTERN;
\1
\2
...

0x03 扩展正则表达式的元字符

1、匹配字符:

.: 匹配任意单个字符
[]: 匹配范围内的任意单个字符
[^]: 匹配范围外的任意单个字符
[:space:]: 空格
[:upper:]: 大写字母
[:lower:]: 小写字母
[:alpha:]: 所有字母
[:alnum:]: 所有的数字和字母
[:digit:]: 所有的数字
[:punct:]: 所有的标点符号

2、匹配个数:

*: 匹配其前字符任意次(包括0次)
?: 匹配其前字符0或1次,即至多一次
+: 匹配其前字符1次或多次,即至少一次
{m}: 匹配其前字符m次
{m,n}: 匹配其前字符至少m次,至多n次
{0,n}: 匹配其前字符至多n次
{m,}: 匹配其前字符至少m次

3、位置锚定:

^: 行首锚定
$: 行尾锚定
\<或\b: 词首锚定
\>或\b: 词尾锚定

4、分组及引用:

(): 将括号内的内容作为一个整体进行匹配
\1
\2
...

5、或:

|: |左边的整体或上右边的整体;
C|cat: 表示C或cat
(c|C)at: 表示cat或Cat

0x04 正则表达式的使用和grep的使用

正则表示一般和一些其他的命令一块使用,只要该命令支持正则表达式的引擎,那么就可以使用正则表达式;下面介绍的grep命令就是一个行处理文本工具,其配合正则表达式的使用,大大提高了文本处理的效率。

grep、egrep、fgrep命令的介绍

grep,egrep,fgrep这三个命令同属于一脉,它们的功能是输出模式匹配到的行,其原理是寻找从标准输入的文件中包含被给定模式所匹配到的行,grep命令,默认输出被模式匹配到的行;

  1. grep命令默认支持基本正则表达式;
  2. egrep命令默认支持扩展正则表达式,相当于grep -E;
  3. fgrep命令不支持正则表达式。

grep命令的使用

1、命令格式

grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

2、命令选项:

--color=auto: 对匹配到的文本着色后高亮显示
-i, --ignore-case: 忽略字符的大小写
-o: 显示模式匹配到的字符;
-v, --invert-match: 显示不能被模式匹配到的行;
-E: 支持使用扩展的正则表达式元字符;
-q, --quiet, --silent: 静默模式,即不输出任何信息;
-A #: 显示匹配到的行以及该行后#行
-B #: 显示匹配到的行以及该行前#行
-C #: 显示匹配到的行以及该行前后#行
egrep命令的使用和grep一样,命令选项也相同;
fgrep命令不支持正则表达式元字符;
当无需用到元字符去编写模式式,使用fgrep必能更好;

0x05 练习

1、显示/etc/passwd文件中以bash结尾的行

# grep "bash$" /etc/passwd

2、显示/etc/passwd文件中的两位数或三位数

# grep -E "(\<[1-9][0-9]\>)|(\<[1-9][0-9][0-9]\>)" /etc/passwd

3、显示netstat -tan命令结果中以‘LISTEN’后跟0个、1个或者多个空白字符结尾的行

# netstat -tan | grep "LISTEN[[:space:]]*$"

4、添加用户bash、testbash、basher以及nologin用户(nologin用户的shell为/sbin/nologin);而后找出/etc/passwd文件中用户名与其shell名相同的行

# grep -E "^([^:]+\>).*\1$" /etc/passwd

5、显示当前系统上root、centos或者user1用户的默认shell和UID (请事先创建这些用户,若不存在)

# grep -E "^(\<root|centos|user1\>)" /etc/passwd | cut -d: -f 3,7

6、找出/etc/rc.d/init.d/functions文件中某单词(单词中间可以存在下划线)后面跟着一组小括号的行

# grep -E "\<.*\>\(\)" /etc/rc.d/init.d/functions

7、使用echo输出一个路径,而后egrep找出其路径基名;进一步的使用egrep取出其目录名以及目录路径

# echo /etc/sysconfig/network-script/ifdown-eth0 | egrep -o "[[:alpha:]]+[^/]?[[:alnum:]]+$"

# echo /etc/sysconfig/network-script/ifdown-eth0 | egrep -o "(.*)/" | egrep -o "[[:alpha:]]+[^/]?[[:alpha:]]+/$" | egrep -o "[[:alpha:]]+[[:punct:]]?[[:alpha:]]+"

# echo /etc/sysconfig/network-script/ifdown-eth0 | egrep -o "/.*/" | egrep -o ".*[[:alnum:]]+"

8、找出ifconfig命令执行结果中1-255之间的数字

# ifconfig | grep -E -o “\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>”

9、取出ifconfig ens33命令结果中的ip地址

# ifconfig ens33 | grep -E -o "\<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"

参考

Linux学习笔记之grep命令和使用正则表达式的更多相关文章

  1. linux shell编程学习笔记(二) --- grep命令

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则表达 ...

  2. Linux学习笔记:常用命令grep、iconv、cp、mv、rm

    本篇记录一些近期常用的命令. 一.grep过滤 grep过滤 不包含某些字符串 cat test.txt | grep -v '.jpg' 过滤jpg结尾的图片 cat test.txt | grep ...

  3. linux学习笔记28--监控命令vmstat,iostat, lsof

    linux的监控包括多个方面,常用的是进程,内存,I/O,磁盘空间这三个方面. vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存.进程. ...

  4. linux学习笔记27--监控命令ps和top,free

    Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...

  5. Linux学习笔记之——基础命令学习

    1.find 按照名字查找:find / -name file_name   2.zip压缩 1) 我想把一个文件repartition.txt和一个目录invader压缩成为amateur.zip: ...

  6. Linux学习笔记15——GDB 命令详细解释【转】

    GDB 命令详细解释 Linux中包含有一个很有用的调试工具--gdb(GNU Debuger),它可以用来调试C和C++程序,功能不亚于Windows下的许多图形界面的调试工具. 和所有常用的调试工 ...

  7. 1)Linux学习笔记:crontab命令

    crond简介 crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程 配置文件 ``` SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin: ...

  8. Linux学习笔记:常用命令

    个人常用的Linux命令总结(持续更新): 切换目录:cd 列出目录下面的文件:ls 显示当前所在的目录:pwd 操作文件 新建文件:touch file01 查看文件内容:less more cat ...

  9. linux学习笔记30--网络命令ifconfig

    许多windows非常熟悉ipconfig命令行工具,它被用来获取网络接口配置信息并对此进行修改.Linux系统拥有一个类似的工具,也就是ifconfig(interfaces config).通常需 ...

随机推荐

  1. 系统管理员必须知道的PHP安全实践

    Apache web 服务器提供了这种便利 :通过 HTTP 或 HTTPS 协议,访问文件和内容.配置不当的服务器端脚本语言会带来各种各样的问题.所以,使用 PHP 时要小心.以下是 25 个 PH ...

  2. QElapsedTimer定时器记录程序执行时间

    QElapedTimer类提供了一种快速计算运行时间的方法,从Qt4.7引入. QElapsedTimer类通常用于快速计算两个事件之间经过了多少时间.它的API与QTime相似,因此可以将正在使用的 ...

  3. 为 Jupyter Notebook指定虚拟环境的 Python 解释器

    说明:本机系统为 win10 64 位, base 是集成于 Anaconda3 的 64 位的python,以下是创建虚拟环境 py366-32,安装 3.6.6 版的 32 为python,把 3 ...

  4. python基本数据类型的时间复杂度

    1.list 内部实现是数组 2.dict 内部实现是hash函数+哈希桶.一个好的hash函数使到哈希桶中的值只有一个,若多个key hash到了同一个哈希桶中,称之为哈希冲突. 3.set 内部实 ...

  5. helm搭建本地chart仓库及基本操作

    这个步骤,是配合公司的竞赛. 因为公司这次的环境,我们只有namespace权限,而没有整个集群的管理, 而且,公司没有提供统一的helm chart repo, 所以只能自建. 参考URL: htt ...

  6. 微信2.1 for Windows发布 微信群可多人语音或视频通话

    5月31日,windows电脑版微信发布更新,微信2.1 for Windows带来最主要的功能是微信群可以多人语音或视频通话了,建个家庭群组,常年在外工作的家人也可以每天见面了,多亲切! 除了可以建 ...

  7. scrapy框架--?乱码unicode

    安装 pip install scrapy 建立一个爬虫项目 scrapy startproject 项目名称 scrapy startproject itcast 进入itcast文件夹 生成一个爬 ...

  8. APIO2019游记

    Day -n~Day -2 文化课好难啊.. Day -1~Day 0 颓颓颓 Day 1 人生第一次用Linux 根本不会 早上刚学会怎么编译 不到1h就上考场实战了 开始之后写了读优 一直编译失败 ...

  9. LeetCode 1146. Snapshot Array

    原题链接在这里:https://leetcode.com/problems/snapshot-array/ 题目: Implement a SnapshotArray that supports th ...

  10. time、datetime

    目录 time() datetime() time() python的时间模块 时间戳: 给电脑看的.1970-01-01 00:00:00到当前时间,按秒计算 格式化时间(Format String ...