Shell编程之正则表达式与文本三剑客

目录

一、正则表达式

1.引言--什么是正则表达式

1.1正则表达式的功能 

2.基础正则表达式(BRE)

2.1特殊字符 

2.2定位符 

2.3非打印字符

3.扩展正则表达式(ERE)

4.元字符操作的案列

二、命令小工具

1.cut:列截取工具

2.sort排序

3.uniq去重

4.tr删除

三、文本三剑客

1.grep命令

2.sed命令

2.1什么是sed

2.2sed的特点 

2.3sed的原理 

2.4常用的操作选项 

2.4.1打印输出 

2.4.2增加内容

2.4.3删除

2.4.4替换和搜索替换

2.4.5插入文件 

2.4.6另存为到文件 

2.4.7同时编辑 

2.4.8分组操作 

2.4.9读取完退出 

2.4.10sed脚本

3.awk

3.1.概述

3.2工作原理

3.3基本语法 

3.4常用案例 

3.4.1内建变量

3.4.2内置变量

3.4.3其他内置变量

3.5BEGIN、END运算

3.6awk高级用法

3.7awk if语句

3.8BEGIN END循环

3.9awk数组

3.10awk循环 


一、正则表达式

1.引言--什么是正则表达式

正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本
正则表达式不只有一种,而且 LINUX 中不同的程序可能会使用不同的正则表达式,如:
工具:grep sed awk egrep 

1.1正则表达式的功能 

(1)正则表达式---通常用于判断语句中,用来检查某一字符串是否满足某一格式
(2)正则表达式是由普通字符与元字符组成
(3)普通字符包括大小写字母、数字、标点符号及一些其他符号
(4)元字符是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式

2.基础正则表达式(BRE)

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

2.1特殊字符 

特殊字符描述示例及解释
\转义符,将特殊字符进行转义,忽略其特殊意义a\.b匹配a.b,但不能匹配ajb,.被转义为特殊意义
^匹配行首^tux匹配以'tux`开头的行
$匹配行尾tux$匹配以tux结尾的行
.匹配除换行符\r\n之外的任意单个字符a.b匹配a和b之间任意一个字符
[list]匹配list列表中的一个字符go[ola]d匹配gold、good、goad,也可以是[a-z]匹配所有小写字母
[^list]匹配任意不在list列表中的一个字符[^a-z]匹配任意非小写字母的字符
*匹配前面子表达式0次或者多次goo*d匹配god、good、gooooood
\{n\}匹配前面的子表达式n次go\{2\}d~匹配good、[0-9]\{2\} 匹配两位数字
\{n,\}匹配前面的子表达式不少于n次go\{2,\}d匹配good、goood等、[0-9]\{2,\}匹配两位及两位以上数字
\{n,m\}匹配前面的子表达式n到m次go\{2,3\}d匹配good、goood、[0-9]\{2,3\}`匹配两位到三位数字

注:egrep、awk使用{n}、{n, }、{n, m}匹配时“{}"前不用加"\”

2.2定位符 

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

2.3非打印字符

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

3.扩展正则表达式(ERE)

通常情况下会使用基础正则表达式就已经足够了,但有时为了简化整个指令,需要使用范围更广的扩展正则表达式

下面举几个例子说明:

+    作用:重复一个或者一个以上的前一个字符

?    作用:零个或者一个的前一个字符 

|    作用:使用或者(or)的方式找出多个字符 

()    作用:查找“组”字符串

()+    作用:辨别多个重复的组 

4.元字符操作的案列

查找特定字符以及反向选择

利用中括号“[]”来查找集合字符以及查找包含重复单个字符 

大小写字母查找"a-z"或"A-Z"以及数字查找

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

“^”符号在元字符集合“[]”符号内外的作用是不一样的 

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

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

二、命令小工具

1.cut:列截取工具

用法:

cut命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出

如果不指定File参数,cut命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一

选项功能
-b按字节截取
-c按字符截取,常用于中文
-d指定以什么为分隔符截取,默认为制表符
-f通常和-d一起

2.sort排序

是一个以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序。例如数据和字符的排序就不一样

选项功能
-t指定分隔符,默认使用[Tab]吧 键或空格分隔
-k指定排序区域,哪个区间排序
-n按照数字进行排序,默认是以文字形式排序
-u等同于uniq,表示相同的数据仅显示一行,注意:如果行尾有空格去重就不成功
-r反向排序,默认是升序,-r就是降序
-o将排序后的结果转存至指定文件

3.uniq去重

主要用于去除连续的重复行
注意:是连续的行,所以通常和sort结合使用先排序使之变成连续的行再执行去重操作,否则不连续的重复行他不能去重

选项功能
-c对重复的行进行计数
-d仅显示重复行
-u仅显示出现一次的行

4.tr删除

它可以用一个字符来替换另一个字符,或者可以完全除去一些字符,也可以用它来除去重复字符

选项功能
-d删除字符
-s删除所有重复出现的字符,只保留第一个

cat fruit | tr " ' " '/'

如果想替换单引号则需要用双引号把单引号引起来,反斜杠转义也不行 

三、文本三剑客

1.grep命令

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

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

2.sed命令

2.1什么是sed

sed命令是利用脚本来处理文本文件。它可以依照脚本的指令来处理、编辑文本文件。主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等

2.2sed的特点 

(1)文本处理工具,读取文本内容,根据指定的条件进行处理,如删除、替换、添加等
(2)可在无交互的情况下实现相当复杂的文本处理操作
(3)被广泛应用于Shel脚本,以完成自动化处理任务
(4)sed依赖于正则表达式

2.3sed的原理 

读入新的一行内容到缓存空间;
从指定的操作指令中取出第一条指令,判断是否匹配 pattern
如果不匹配,则忽略后续的编辑命令,回到第 2 步继续取出下一条指令;
如果匹配,则针对缓存的行执行后续的编辑命令;完成后,回到第 2 步继续取出下一条指令;
当所有指令都应用之后,输出缓存行的内容;回到第 1 步继续读入下一行内容;
当所有行都处理完之后,结束

2.4常用的操作选项 

sed [ 选项 ] ' 操作 ' 参数
选项功能
-e
进行多次编辑
-n
取消默认输出
-f
指定 sed 文件名
-i
直接在源文件中修改
-r
使用扩展正则表达式
命令动作功能
p
打印输出
d
删除指定行
i
在指定行之前插入内容
a
在指定行后面插入内容
c
替换指定行所有内容
s
搜索替换
2.4.1打印输出 

sed默认不支持扩展正则,如果要支持,需要加-r选项 

2.4.2增加内容

2.4.3删除

2.4.4替换和搜索替换

这里有个注意点:

c指令是整行替换

s指令是关键词替换

常用的选项:
g: 行内全局替换
p: 显示替换成功的行
w: 将替换成功的行保存至文件中
I,i: 忽略大小写

2.4.5插入文件 

2.4.6另存为到文件 

2.4.7同时编辑 

2.4.8分组操作 

2.4.9读取完退出 
正常情况下 sed 会在读取完所有数据行之后退出,但是我们可以随时使用 q 指令来提前退出 sed

2.4.10sed脚本

3.awk

3.1.概述

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具
它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总工作

3.2工作原理

当读到第一行时,匹配条件,然后执行指定动作,再接着读取第二行数据处理,不会默认输出
如果没有定义匹配条件默认是匹配所有数据行, awk 隐含循环,条件匹配多少次动作就会执行多少次
逐行读取文本,默认以空格或 tab 键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令
(1)BEGIN 语句设置计数和打印头部信息,在任何动作之前进行
(2)END 语句输出统计结果,在完成动作之后执行
AWK 执行的流程非常简单:读( Read )、执行( Execute )与重复( Repeat

3.3基本语法 

命令格式:
awk   选项   模式或条件 { 操作 }   文件 1 文件 2 ...
awk -f 脚本文件   文件 1   文件 2 ..
格式: awk 关键字   选项   命令部分   '{xxxx}'   文件名
AWK 支持两种不同类型的变量:内建变量 ( 可直接使用 ) ,自定义变量 awk 内置变量(预定义变量)
FS
指定每行文本的字段分隔符,默认为空格或制表位
NF
当前处理的行的字段个数。在执行过程中对应于当前的字段数, NF :列的个数
NR
当前处理的行的行号(序数)在执行过程中对应于当前的行号
$0
当前处理的行的整行内容
$n
当前处理行的第 n 个字段(第 n 列)。比如 : $1 表示第一个字段, $2 表示第二个字段
FILENAME
被处理的文件名 ( 当前输入文件的名)
FNR
各文件分别计数的行号
OFS
输出字段分隔符(默认值是一个空格)
ORS
输出记录分隔符(默认值是一个换行符)
RS
行分隔符(数据记录分隔,默认为 \n ,即每行为一条记录 )

3.4常用案例 

3.4.1内建变量
awk 包含几个特殊的内建变量(可直接用)如下所示
FS
指定每行文本的字段分隔符,默认为空格或制表位
NF
当前处理的行的字段个数
NR
当前处理的行的行号(序数)
$0
当前处理的行的整行内容
$n
当前处理行的第 n 个字段(第 n 列)
FILENAME
被处理的文件名
RS行分隔符(数据记录分隔,默认为\n,即每行为一条记录 )

patterm和' '不会显示任何东西

print:多打印一遍

字符串引用要添加双引号

重定向输出,文件里有多少行就重新输出多少行

3.4.2内置变量
awk 常用内置变量
$1
代表第一列
$2
代表第二列以此类推
$0
代表整行
NF
一行的列数
NR
行数

扩展生产案例:网卡的IP、流量;根分区的可用量

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

3.5BEGIN、END运算

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

模糊匹配,用~表示包含,!~表示不包含  

关于数值与字符串的比较
比较符号: == != <= >= < >

逻辑运算  && ||
&& || 是逻辑运算符,用于组合多个条件并控制程序流程
&& 要求所有条件都为真时才为真,否则为假
|| 只要有一个条件为真就为真,全为假时才为假

3.6awk高级用法

3.7awk if语句

3.8BEGIN END循环

awk 还支持 for 循环、 while 循环、函数、数组等
第一步:运行 BEGIN{ commands } 语句块中的语句
第二步:从文件或标准输入 (stdin) 读取一行。然后运行 pattern{ commands } 语句块,它逐行扫描文件,从第一行到最后一行反复这个过程。直到文件所有被读取完成
第三步:当读至输入流末尾时,运行 END{ commands } 语句块
(1)BEGIN 语句块在 awk 开始从输入流中读取行之前被运行,这是一个可选的语句块,比方变量初始化、打印输出表格的表头等语句通常能够写在BEGIN 语句块中
(2)END 语句块在 awk 从输入流中读取全然部的行之后即被运行。比方打印全部行的分析结果这类信息汇总都是在END 语句块中完毕,它也是一个可选语句块
(3)pattern 语句块中的通用命令是最重要的部分,它也是可选的。假设没有提供 pattern 语句块,则默认运行{ print } ,即打印每个读取到的行。 awk 读取的每一行都会运行该语句块

3.9awk数组

BEGIN 中的命令只执行一次
awk数组 的下标除了可以使用数字,也可以使用字符串,字符串需要使用双引号

3.10awk循环 

筛选日志文件 

总结

grep egrep 文本过滤 ( 更适合单纯的查找或匹配文本 )
sed 流编辑器 实现编辑的 ( 更适合编辑匹配到的文本 )
awk 文本报告生成器 实现格式化文本输出 ( 更适合格式化文本,对文本进行较复杂格式处理 )
  • 29
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值