正则表达式

一、正则表达式

1. 正则表达式定义

正则表达式(Regular Expressions,简称regex 或regexp、RE)是一种用于描述字符串模式的工具。它可以用于匹配、搜索、替换和验证文本

1.1 正则表达式工具

正则表达式不只有一种,而且 LINUX 中不同的程序可能会使用不同的正则表达式,如:工

  • grep
  • sed
  • awk
  • egrep

1.2 正则表达式组成

正则表达式是由普通字符与元字符组成

  • 普通字符包括大小写字母、数字、标点符号及一些其他符号
  • 元字符是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式

LINUX 中常用的有两种正则表达式引擎

  • 基础正则表达式:BRE
  • 扩展正则表达式:ERE
     

4. 基础正则表达式

基础正则表达式常见元字符:(支持的工具:grep、egrep、sed、awk)

特殊字符

\:转义符,将特殊字符进行转义,忽略其特殊意义a\.b匹配a.b,但不能匹配ajb,.被转义为特殊意义\\\\
^:匹配行首,^则是匹配字符串的开始^tux匹配以tux开头的行^^^^
$:匹配行尾,$则是匹配字符串的结尾tux$匹配以tux结尾的行$$$$ 
.:匹配除换行符\r\n之外的任意单个字符
\+:  匹配前面的字符出现至少一次
[list]:匹配list列表中的一个字符 例: go[ola]d,[abc]、[a-z]、[a-z0-9]
[^list]:匹配任意不在list列表中的一个字符 例: [^a-z]、[^0-9]、[^A-Z0-9]
*:  匹配前面子表达式0次或者多次 例:goo*d、go.*d
\{n\} :  匹配前面的子表达式n次,例:go\{2\}d、'[O-9]\{2\}'匹配两位数字
\{n,\}:  匹配前面的子表达式不少于n次,例: go\{2,\}d、' [0-9]\{2,\}'匹配两位及两位以上数宁
\{n,m\}﹔匹配前面的子表达式n到m次,例: go\{2,3\)d、'[0-9]\{2,3\}'匹配两位到三位数字
注: egrep、awk使用{n}、{n, }、{n, m}匹配时“{}"前不用加"\”

定位符:

^ 匹配输入字符串开始的位置
$ 匹配输入字符串结尾的位置

非打印字符:

\n 匹配一个换行符
\r 匹配一个回车符
\t 匹配一个制表符

5. 扩展正则表达式

扩展正则表达式(支持的工具:egrep、awk)
通常情况下会使用基础正则表达式就已经足够了,但有时为了简化整个指令,需要使用  范围更广的扩展正则表达式。
与基础正则表达式类型相同,扩展正则表达式也包含多个元字符,常见的扩展正则表达  式的元字符主要包括以下几个.

+    作用:重复一个或者一个以上的前一个字符
示例:执行“egrep -n 'wo+d' test.txt”命令,即可查询"wood" "woood" "woooooood"等字符串

?    作用:零个或者一个的前一个字符
示例:执行“egrep -n 'bes?t' test.txt”命令,即可查询“bet”“best”这两个字符串

|    作用:使用或者(or)的方式找出多个字符
示例:执行“egrep -n 'of|is|on' test.txt”命令即可查询"of"或者"if"或者"on"字符串

()    作用:查找“组”字符串
示例:“egrep -n 't(a|e)st' test.txt”。“tast”与“test”因为这两个单词的“t”与“st”是重复的,所以将“a”与“e”
列于“()”符号当中,并以“|”分隔,即可查询"tast"或者"test"字符串

()+    作用:辨别多个重复的组
示例:“egrep -n 'A(xyz)+C' test.txt”。该命令是查询开头的"A"结尾是"C",中间有一个以上的"xyz"字符串的意思

例如,使用基础正则表达式查询除文件中空白行与行首为“#”之外的行(通常用于查看生效的配置文件),执行“grep -v‘^$’test.txt | grep -v‘^#’”即可实现。这里需要使用管道命令来搜索两次。如果使用扩展正则表达式

可以简化为“egrep -v‘^$|^#’test.txt”,其中,单引号内的管道符号表示或者(or)。


此外,grep 命令仅支持基础正则表达式,如果使用扩展正则表达式,需要使用 egrep 或 awk 命令。awk 命令在后面的小节进行讲解,这里我们直接使用 egrep 命令。egrep 命令与 grep 命令的用法基本相似。egrep 命令是一个搜索文件获得模式,使用该命令可以搜索文件中的任意字符串和符号,也可以搜索一个或多个文件的字符串,一个提示符可以是单个字符、一个字符串、一个字或一个句子

 二、grep

grep 是一个用于在文件或标准输入中搜索文本模式的命令行工具。它基于正则表达式(regex)进行文本匹配,能够高效地查找和筛选文本内容

1. grep 常用参数

 grep    [选项]     查找条件     目标文件

-E :开启扩展(Extend)的正则表达式
-c :计算找到 '搜寻字符串' 的次数
-i :忽略大小写的不同,所以大小写视为相同
-o :只显示被模式匹配到的字符串
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!(反向查找,输出与查找条件不相符的行)
--color=auto :可以将找到的关键词部分加上颜色的显示
-n :顺便输出行号

2.grep 操作案例

(1)查找特定字符

统计root字符总行数:

不区分大小写查找the所有的行:

过滤以nologin结尾的行:

过滤IP:

过滤并显示行号:

(2)利用中括号“[ ]”查找集合字符

“[ ]”中无论有几个字符, 都仅代表一个字符,也就是说“[io]”表示匹配“i”或者“o”

若查找“oo”前面不是“w”的字符串,只需要通过集合字符的反向选择“[^]”来实现该目的

若不希望“oo”前面存在小写字母,可以使用“grep [^a-z]oo’test.txt”命令实现,大写则是A-Z

查找包含数字的行可以通过“grep -n ‘[0-9]’test.txt”命令来实现

(3)查找行首“^”与行尾字符“$”

基础正则表达式包含两个定位元字符:“^”(行首)与“$”(行尾)。在上面的示例中, 查询“the”字符串时出现了很多包含“the”的行,如果想要查询以“the”字符串为行首的行,则可以通过“^”元字符来实现

“^”符号在元字符集合“[]”符号内外的作用是不一样的,在“[ ]”符号内表示反向选择,在“[]” 符号外则代表定位行首。反之,若想查找以某一特定字符结尾的行则可以使用“$”定位符

查询空白行时,执行“grep -n‘^$’test.txt”命令即可

(4)查找任意一个字符“.”与重复字符“*”

在正则表达式中小数点(.)也是一个元字符,代表任意一个字符。例如执行以下命令就可以查找“w??d”的字符串,即共有四个字符,以 w 开头 d 结尾

查询以 w 开头 d 结尾,中间包含至少一个 o 的字符串,执行以下命令即可实现

执行以下命令即可查询以 w 开头 d 结尾,中间的字符可有可无的字符串

(5)查找连续字符范围“{}”

在上面的示例中,使用了“.”与“*”来设定零个到无限多个重复的字符,如果想要限制一个范围内的重复的字符串该如何实现呢?例如,查找三到五个 o 的连续字符,这个时候就需要使用基础正则表达式中的限定范围的字符“{}”。因为“{}”在 Shell 中具有特殊意义,所以在使用“{}”字符时,需要利用转义字符“\”,将“{}”字符转换成普通字符

 查询两个 o 的字符

查询以 w 开头以 d 结尾,中间包含 2~5 个 o 的字符串

查询以 w 开头以 d 结尾,中间包含 2 个或 2 个以上 o 的字符串

三、sed 

sed(Stream EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行。sed也可以在无交互的情况下实现相当复杂的文本处理操作,被广泛应用于Shell脚本中,用以完成各种自动化处理任务

1. sed 工作流程 

sed 的工作流程主要包括读取、执行和显示三个过程。

  • 读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
  • 执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行。
  • 显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。

在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

2. sed 常用参数

sed    [选项]    '操作'    参数

常用的sed命令选项

-e 或--expression=: 表示用指定命令或者脚本来处理输入的文本文件
-f 或--file=: 表示用指定的脚本文件来处理输入的文本文件
-h 或--help: 显示帮助
-n、--quiet 或 silent: 表示仅显示处理后的结果
-i.bak: 直接编辑文本文件
  -r, -E  使用扩展正则表达式
  -s   将多个文件视为独立文件,而不是单个连续的长文件流

“操作” 用于指定对文件操作的动作行为,也就是 sed 的命令。通常情况下是采用的“[n1[,n2]]”操作参数的格式。n1、n2 是可选的,代表选择进行操作的行数,如操作需要在 5~ 20 行之间进行,则表示为“5,20 动作行为”。

常见的操作包括以下几种

a:增加,在当前行下面增加一行指定内容。
c:替换,将选定行替换为指定内容。
d:删除,删除选定的行。
i:插入,在选定行上面插入一行指定内容。
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。
s:替换,替换指定字符。
y:字符转换。

3. sed 操作示例

(1)输出符合条件的文本(p 表示正常输出)

sed -n 'p' test.txt         #输出所有内容,等同于 cat test.txt


 

显示1-4行的内容:

输出包含 ”the“ 的行

输出以”he”开头的行

(2)删除符合条件的文本(d)

在执行删除操作之前最好先将测试文件备份

删除第二行:

删除1-3行:

删除带“was”的行:

删除以“.”符号结尾的行   (特殊字符需要转义):

删除空行:

(3)替换符合条件的文本

在使用 sed 命令进行替换操作时需要用到 s(字符串替换)

在每行头添加#:

在每行的结尾加上.bak :

将全局的o替换成O    (若不加g则是将每行第一个o替换成O):

将1-3行的o替换成O:

将含有“was”的行中的o替换成O

(4)迁移符合条件的文本

H:    复制到剪贴板;
g、G:    将剪贴板中的数据覆盖/追加至指定行;
w:  保存为文件;
r:  读取指定文件;
a:  追加指定内容。具体操作方法如下所示。
  I,i   忽略大小写

将行中包含“shot”的迁移到文本的行尾:

将cs.txt中含有“was”的行另存到cs2.txt    (若没有cs2.txt,则自动创建)

将cs.txt的内容添加到cs2.txt中含有“was”的行下

在包含“and”行下插入BAK

(5)同时编辑

删除第二行;将第三行所有的o替换成O   (-e可以同时进行操作)

(6)使用脚本编辑文件

使用 sed 脚本将多个编辑指令存放到文件中(每行一条编辑指令),通过“-f”选项来调用

sed '1,5{H;d};16G' test.txt    //将第 1~5 行内容转移至第 16 行后

例1:

写成脚本

执行时,sed -f:

例2:
  • sed脚本文件第一行要声明#!/bin/sed -f
  • 不要加单引号
  • 每行的最后不能有空格等多余字符
  • #号开头为注释
  • 一行有多个命令时用分号隔开

四、awk 

1. awk 介绍

是一个功能强大的文本处理工具,在类 Unix 操作系统中广泛应用。它以其名字的首字母命名,分别来自其最初三位作者的姓氏:Alfred Aho, Peter Weinberger 和 Brian Kernighan。awk 语言适用于数据提取和报告生成,是一种模式扫描和处理语言

awk Aho, Weinberger, Kernighan ,报告生成器,格式化文本输出, GNU/Linux 发布的 AWK 目前由自
由软件基金会( FSF )进行开发和维护,通常也称它为 GNU AWK
有多种版本:
  • AWK:原先来源于 AT & T 实验室的的AWK
  • NAWKNew awkAT & T 实验室的AWK的升级版
  • GAWK:即GNU AWK。所有的GNU/Linux发布版都自带GAWK,它与AWKNAWK完全兼容

2. 工作原理

当读到第一行时,匹配条件,然后执行指定动作,再接着读取第二行数据处理,不会默认输出
如果没有定义匹配条件默认是匹配所有数据行, awk 隐含循环,条件匹配多少次动作就会执行多少次 逐行读取文本,默认以空格或tab 键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按 模式或者条件执行编辑命令。
sed命令常用于一整行的处理,而 awk 比较、倾向于将一行分成多个 "" 字段 " 然后再进行处理。 awk
信息的读入也是逐行读取的,执行结果可以通过 print 的功能将字段数据打印显示。在使用 awk 命令的过 程中, 可以使用逻辑操作符 " &&" 表示 " " "|| 表示 " " "!" 表示非 "; 还可以进行简单的数学运算,如 + 、 -、* / % ^ 分别表示加、减、乘、除、取余和乘方

2.1 运行模式

  • 正则表达式 : /root/ 匹配含有 root 的行 /*.root/
  • 关系表达式: < > && || + *
  • 匹配表达式: ~ ~ 动作:
  • 变量 命令 内置函数 流控制语句它的语法结构如下

awk [options] 'BEGIN{ print "start" } ‘pattern{ commands }’ END{ print "end" }'

2.2 执行流程

BEGIN 语句设置计数和打印头部信息,在任何动作之前进行
END 语句输出统计结果,在完成动作之后执行
AWK 执行的流程非常简单:读( Read )、执行( Execute )与重复( Repeat )。下面的流程图描述出 了AWK 的工作流程

从上图我们已经了解了 AWK 程序的工作流程。接下来我们来看一看 AWK 程序的结构。
开始块( BEGIN block
顾名思义,开始块就是在程序启动的时候执行的代码部分,并且它在整个过程中只执行一次。一般情况 下,我们在开始块中初始化一些变量。BEGIN AWK 的关键字,因此它必须是大写的。不过,开始块部 分是可选的,你的程序可以没有开始块部分。
主体块( Body Block
对于每一个输入的行,都会执行一次主体部分的命令。默认情况下,对于输入的每一行, AWK 都会执行命令。注意:在主体块部分,没有关键字存在。
结束块( END Block
它是在程序结束时执行的代码。 END 也是 AWK 的关键字,它也必须大写。与开始块相似,结束块也是可选的
通过上面我们可以知道 ;AWK 它工作通过三个步骤
  • 1、读(Read):从文件、管道或标准输入中读入一行然后把它存放到内存中
  • 2、执行(Execute):对每一行数据,根据 AWK 命令按顺序执行。默认情况是处理每一行数据,也可以指定模式
  • 3、重复(Repeat):一直重复上述两个过程直到文件结束

3. 基本语法

格式: awk 关键字     选项     命令部分    '{xxxx}'     文件名
AWK 支持两种不同类型的变量:内建变量 ( 可直接使用 ) ,自定义变量 awk 内置变量(预定义变量)
如下所示:
  • FS:指定每行文本的字段分隔符,默认为空格或制表位。
  • NF:当前处理的行的字段个数。在执行过程中对应于当前的字段数,NF:列的个数
  • NR:当前处理的行的行号(序数)。 在执行过程中对应于当前的行号
  • $0:当前处理的行的整行内容。
  • $n:当前处理行的第 n 个字段(第 n 列)。比如: $1 表示第一个字段,$2 表示第二个字段
  • FILENAME:被处理的文件名(当前输入文件的名)
  • FNR 各文件分别计数的行号
  • OFS 输出字段分隔符(默认值是一个空格)
  • ORS 输出记录分隔符(默认值是一个换行符)
  • RS:行分隔符。awk从文件上读取资料时,将根据Rs的定义把资料切割成许多条记录, awk一次仅读入一条记录,以进行处理。预设值是" \n'
  • 简说:数据记录分隔,默认为\n,即每行为一条记录

4.实战案例

4.1 内建变量

awk 包含几个特殊的内建变量(可直接用)如下所示:

  • FS:指定每行文本的字段分隔符,默认为空格或制表位。
  • NF:当前处理的行的字段个数。
  • NR:当前处理的行的行号(序数)。
  • $0:当前处理的行的整行内容。
  • $n:当前处理行的第 n 个字段(第 n 列)。
  • FILENAME:被处理的文件名。
  • RS:行分隔符。awk从文件上读取资料时,将根据Rs的定义把资料切割成许多条记录, awk一次仅读入一 条记录,以进行处理。预设值是" \n'
  • 简说:数据记录分隔,默认为\n,即每行为一条记录

打印文件内容:

打印文本内容的第一列和第二列   (默认以空格分隔)

以“:”为间隔,打印出文本第一列和第二列

以“x”为间隔,打印出文本第一列和第二列

以“:”和“/”为间隔,打印出文本第九列内容

4.2 内置变量

awk常用内置变量:$1$2NFNR$0

  • $1:代表第一列
  • $2:代表第二列以此类推
  • $0:代表整行
  • NF:一行的列数
  • NR:行数

打印文本中包含root的行

以“:”为间隔,打印出包含root的行中第一列和第七列

打印第二行

打印行列

4.3 BEGIN 、END 运算

逐行执行开始之前执行什么任务,结束之后再执行什么任务,用 BEGIN END
BEGIN 一般用来做初始化操作,仅在读取数据记录之前执行一次
END 一般用来做汇总操作,仅在读取完数据记录之后执行一次

BEGIN

例:awk.txt 内容

打印一个标题行,然后再将文本中每一行内容打印出来:

END

END则是先执行前面的打印内容再执行后面的打印标题行

结合BEGIN和END 

例:计算出文本中所有数的总和并打印出来

4.4 其他内置变量的用法

FS (输入)、 OFS NR FNR RS ORS
FS :输入字段的分隔符 默认是空格
OFS :输出字段的分隔符 默认也是空格
FNR :读取文件的记录数(行号),从 1 开始,新的文件重新重 1 开始计数
RS :输入行分隔符 默认为换行符
ORS :输出行分隔符 默认也是为换行符

FS:

在打印之前定义字段分隔符为冒号

OFS:

OFS定义了打印出来的内容以什么分隔,$1$2要,隔开

FNR:

追加文件重新从1开始

RS:

输入行分隔符,指定的是文件存在的字符

ORS:

多行合并一行输出,自定义“---”为分隔符

4.5 awk if 语句

第三列小于10的,打印整行

第三列小于5的打印整行,否则打印第一列

4.6 awk 数组

awk 数组的下标除了可以使用数字,也可以使用字符串,字符串需要使用双引号

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值