正则表达式和shell三剑客(grep、egrep、sed和awk)工具

正则表达式和shell三剑客(grep、egrep、sed和awk)工具

一、正则表达式

正则表达式是一种文本模式,包括普通字符和特殊字符(元字符和修饰符)。使用字符串来描述、匹配一系列匹配某个句法规则的字符串。

1.1 语法

正则表达式描述了一种字符串匹配的模式,可以用来检测一个字符串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

构建正则表达式的方式和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。

正则表达式是由普通字符以及特殊字符组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所有搜索的字符串进行匹配。

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

  • 基础正则表达式:BRE 支持的工具:grep、egrep、sed、awk
  • 拓展正则表达式:ERE 支持的工具:egrep、awk
1.2 修饰符

标记也称为修饰符,正则表达式的标记用于指定额外的匹配策略。

标记不写在正则表达式里,标记位于表达式之外。

格式:
    /pattern/flags
修饰符含义描述
iignore-不区分大小写将匹配设置为不区分大小写,搜索时 不区分大小写。
gglobal-全局匹配查找所有的匹配项。
mmulti line-多行匹配使吧边界字符^和$匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。
s特殊字符圆点.中包含换行符\n默认情况下的圆点.是匹配除换行符\n之外的任何字符,加上s修饰符后,.中将会包含换行\n的。
1.3 元字符

所谓元字符,就是用于构建正则表达式的具有特殊含义的字符。例如:+*?

1.3.1 限定符

所谓限定符,就是限定一个原子必须出现多少次。

字符描述
+匹配前面的子表达式一次或多次。
*匹配前面的子表达式零次或多次。
匹配前面的子表达式零次或一次。
{n}n是一个非负整数。匹配前面的子表达式确定的n次。
{n,}n是一个非负整数。匹配前面的子表达式至少n次
{n,m}n和m是一个非负整数。其中n<=m。最少匹配前面的子表达式n次且最多匹配m次。
注:在逗号和两个数之间不能由空格。
1.3.2 边界限定符
字符描述
^匹配字符串的开始位置。
$匹配字符串的结束位置。
\b匹配一个单词的边界,指的是单词和空格间的位置。
\B匹配非单词比边界。
例:
    字符串:log var never verb
    "er\b" 匹配的是never的er
    "er\B"匹配的是verb的er
1.3.3 其他类的元字符
字符描述
\转义字符,将下一个字符标记位一个特殊字符或取消特殊符号的含义。例如:n为普通字符加上\为\n表示换行,比如要输入字符\,则需要\\来表示一个\字符。
.匹配除了换行符(\n,\r)之外的任何单个字符。
[list]字符集合。匹配所包含的任意一个字符。
[^list]负字符集合。匹配任何不在范围内的任意字符。
\s匹配任何空白字符,包括空格、制表符、换页符等。
\S匹配任何非空白字符,及\s的取非
\w匹配字母数字下划线
\W匹配非字母数字下划线,即\w的非取非
1.4 正则表达式-运算符优先级

正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。

相同优先级的从左到右进行运算,不同优先级的运算先搞后低。

优先级从高到低如下表

运算符描述
\转义符
(),[]圆括号和方括号
*,+,?,{n,m}限定符
^,$,\任何元字符、任何字符位置和顺序
|替换,或操作
字符具有高于替换换算符的优先级,使得

二、Grep和egrep

2.1 两者介绍
  • grep是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。
  • egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。
2.2 grep和egrep选项
grep 选项 查找条件 目标文件
egrep和grep选项相同:
	-E:开启扩展的正则表达式
	-c:计算过滤到的字符串的次数(如果匹配多个字符串在同一行只算一次)
	-i:忽略大小写
	-w:精确查找
	-o:只显示被模式匹配到的字符串
	-v:反向选择,即显示非匹配的字符串
	--color=auto:可以降找到的关键词部分加上颜色的显示
	-n:输出行号
2.3 和正则一起使用

image-20220707150038620

正则表达式一起使用:

与正则限定符使用:

image-20220707151053249

image-20220707155403902

正则的多条件匹配:

image-20220707151838934

也可以借助管道符实现多条件匹配:

image-20220707161124569

与正则实现范围的匹配:

image-20220707161817383

image-20220707163604202

image-20220707163806660

三、sort、unqi、cut、tr工具

3.1 cut工具

cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。

-b:按字节截取
-c:按字符截取,常用于中文
-d:指定以分隔符截取,默认为制表符
-f:指定截取的行数,如:1截取第1列,13截取第1和第3列,1-3截取第13

例题:

image-20220707172343115

3.2 sort工具

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

语法:
sort 选项 参数
	-t:指定分隔符,默认使用制表符或空格分隔
	-k:指定排序区域,与-t一起使用,实现对不同关键字排序
	-n:以数字进行排序,默认以文字大小排序
	-u:等同于uniq,表示相同的数据仅显示一行,以换行符为终止,所以如果字符串后有空格也会一起比较
	-r:默认升序排序,-r表示降序排序
	-o:将排序后的结果转存只指定文本

image-20220707174703906

image-20220707175006974

3.3 unqi工具

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

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

image-20220707175258504

image-20220707175513599

image-20220707175734126

3.4 tr工具

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

tr 选项 string1 string2
    从标志输入中替换、缩减和/或删除字符,并将结果写道标志输出。
    -d:删除字符
    -s:删除所有重复出现的字符,只保留一个

image-20220707180220089

image-20220707180629780

image-20220707180814500

实际应用:

1.统计当前连接主机数

ss -nt |tr -s " "|cut -d " " -f5|cut -d ":" -f1 |sort|uniq -c|

image-20220707181738400

2.统计当前主机的连接状态

ss -nta | grep -v '^State' |cut -d" " -f1|sort |uniq -c

image-20220707182039995

四、Sed 工具

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

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

注意:默认情况下所有的 sed 命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。

sed 选项 操作参数
sed 选项 -f scriptfile参数
    常见的sed命令选项主要包含以下几种。
    -e:表示用指定命令或者脚本来处理输入的文本文件。
    -f:表示用指定的脚本文件来处理输入的文本文件。
	-n、--quiet或silent:表示仅四按时处理后的结果。
    -i:直接编辑文本文件
    -r,-E:使用扩展正则表达式
    -s将多个文件视为独立文件,而不是单个连续的长文件流

**操作:**用于指定对文件操作的动作行为,也就是 sed 的命令。

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

sed输出行时可以与n和$等特殊意义字符一起使用

image-20220708004916137

$:表示文件中末行
n:next,下一行

image-20220708001223063

image-20220708002255708

image-20220708002826277

也可以与正则的编辑限定符一起使用

image-20220708003250227

image-20220708003839088

image-20220708004330177

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

image-20220708005155120

image-20220710232926988

image-20220710233058924

image-20220710233244486

4.3 替换符合条件的文本(s)
s:字符串替换
c:整行/整块替换
y:字符替换(以一个字符为单位替换)

image-20220710233736065

image-20220710234035026

image-20220710234336022

格式 sed 'n,m(即行数,指定n-m行范围)s/要被替换的内容/替换的内容/选择范围(g全文,默认为1即替换每行第一个,2即替换每行第二个)'

image-20220710234132531

image-20220710234221806

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

image-20220710235259065

image-20220710235527132

image-20220710235824289

image-20220711000054566

image-20220711000346896

4.5 使用脚本编辑文件
使用sed工具脚本将多个编辑指令存放到文件中(每行一条编辑指令),通过“-f”选项来调用。
    例如:sed '/yes/{H;d};$g' ifcfg-ens33
    这是将文本中的带有yes的行移动到文末
	可以编辑一个指令文本来实现,如
    order.txt:
	/yes/H
    /yes/d
    $g

image-20220711135222702

4.6 sed分组操作

当我们需要对一行数据进行多次操作的时候我们可以使用{}进行分组或-e分组执行。

image-20220711140811102

五、Awk工具

5.1 Awk概述

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总工作
数据可以来自标准输入也可以是管道或文件

5.2 工作原理:

逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。

命令格式:
    awk 选项 ‘模式或条件{操作}’ 文件1 文件2
    awk -f 脚本文件 文件1 文件2
    awk 包含几个特殊的内建变量(可直接用)如下所示:
    
	FS:指定每行文本的字段分隔符,默认为空格或制表位。
	NF:当前处理的行的字段个数。
	NR:当前处理的行的行号(序数)。
	$0:当前处理的行的整行内容。
	$n:当前处理行的第 n 个字段(第 n 列)。
	FILENAME:被处理的文件名。
5.3 按行输出

在使用Awk的过程中,可以使用关系运算符作为“条件”,用于比较数字与字符串,运算符有大于、小于、大于等于、小于等于、等于、不等于这些,也可以使用是逻辑操作符&&和||、!,还可以使用算术运算+、-、*、/、%、^、**等。当这些条件为真时,才执行指定动作。

[root@setting-style test]# awk -F: '/root/{print $0}' passwd 

[root@setting-style test]# awk -F: 'NR==2' passwd 

[root@setting-style test]# awk -F: '{print NF}' passwd 
    

image-20220711151814395

[root@setting-style test]# awk -F: 'NR==2||NR==5' passwd 

[root@setting-style test]# awk -F: 'NR==2,NR==5' passwd 

[root@setting-style test]# awk -F: '(NR>=2)&&(NR<=5)' passwd 

image-20220711152439579

5.4 按列输出
awk -F: '{print $1}' passwd

image-20220711154304050

awk -F: '$3>900' passwd

image-20220711154630969

awk -F ":" '{print $1,$3}' passwd
    
awk -F ":" '$3<5{print $1,$3}' passwd

image-20220711154805752

image-20220711155043151

网卡的ip、流量
    ifconfig ens33 | awk '/netmask/{print "p地址:"$2}'
    
    ifconfig ens33 | awk '/RX p/{print $5" byte"}

image-20220711155558631

5.5 Awk拓展

其他内置变量的用法FS、OFS、NR、FNR、RS、ORS

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

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

awk 'BEGIN{FS=":";OFS="--"}{print $1,$2}' passwd
    
awk 'BEGIN{FS=":";OFS="--"}{print FNR,$1,$2}' passwd 

image-20220711164214404

image-20220711165407482

END{ }语句块中,往往会放入打印结果等语句
    
echo $PATH | awk 'BEGIN{RS=":"};END {print NR}'

image-20220711195338337

Awk与变量,编程语句(if,for,while,函数和数组)一起使用

[root@setting-style test]# a=100
[root@setting-style test]# awk -v b="$a" 'BEGIN{print b}'
    
[root@setting-style test]# seq 6 | awk '{getline;print $0}'

image-20220711194057447

awk -F: '{if($3<10){print $0}}' passwd

awk '{if($1<10){print $1}else{print $2}}' test.txt

image-20220711194531178

image-20220711195016507

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值