29 Linux——shell编程之正则表达式和字符截取命令(awk+sed)

本文介绍了Linux shell编程中的基础正则表达式和字符截取命令,包括awk和sed的使用。讲解了如何通过正则表达式进行全文搜索,以及awk在处理文件内容和字段提取中的应用。同时,详细阐述了sed命令在文本修改和处理中的功能,强调了awk和sed在处理命令输出和文件内容上的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

基础正则表达式

在这里插入图片描述

上图一定记住正则表达式是在文件中搜索字符串,通配符是在系统中搜索文件名

完全匹配就是内容必须一模一样才会列出,但是包含的内容没有,包含匹配就是搜索的内容只要包含在字符串这一行内就会列出。

写一个文件如下图

在这里插入图片描述

在这里插入图片描述

上图倒数第二个和倒数第三个记倒数第三个就行

比如上图第一个,a*代表一个a都没有或者一个a,或者n个a,*前面必须有内容

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

正则表达式的.*和通配符的*是一个作用

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

字符截取命令

在这里插入图片描述

上图printfawk中需要用到的一个命令,严格上说不算字符提取命令

grep是在文件当中提取符合条件的行,cutawk就是提取列

在这里插入图片描述

在这里插入图片描述

注意上图IDName那一行互相之间空的绝对不能是空格,而是应该是制表符(Tab),不然的话cut不能正确继续。

在这里插入图片描述
上图分隔符是制表符,即tab
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

下图为vim /etc/passwd

在这里插入图片描述

在这里插入图片描述

上图提取出来新增加的三个用户的行,用户的shell都是/bin/bash,最后反转去掉root,因为root不能删。

下图这样就提取出来了,后面用循环的方式删除

这就是cutgrep最主要的左右,在文本当中提取出需要的字段,当然cut不能独立使用,一般都是通过管道符的方式与grep联合使用如下图

在这里插入图片描述

在这里插入图片描述
比如说我想写一个脚本,用这个脚本来判断根分区的使用率,如果使用率超过80%,我的程序让它报警,告诉管理员。 (看下图第三行),那如何提取那一行那一列?看下下图

注意cut默认分隔符是tab,如果不是就无法提取如下下图
在这里插入图片描述

在这里插入图片描述

如果是空格作为分隔符就需要用awk命令来实现列提取,但是awk远比cut复杂,如果cut能够实现的功能,即分隔符用tab,冒号,句号这些分隔的,就用cut

如上图因为分隔符有空格,所以df -h的结果cut不能处理。

awk功能很强大,一般不叫awk命令,而叫awk编程,它里面可以实现流程控制,条件判断,甚至可以实现变量赋予

printf命令(格式化打印命令)

printf是最常用在awk这个字符列提取命令当中的标准输出格式

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

三个%s代表每三个字符串输出一次。

如下图,printf命令不能直接加文件名,也不能通过管道符来接收第一条命令的执行结果。它只能用下下图这种方式

在这里插入图片描述

在这里插入图片描述

所以printf远没有echo/cat输出文件内容方便,我们学习是因为这是awk编程中最基本的命令输出方法。在awk中不能直接调用系统命令echo/cat

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

awk编程

awk作用就是和cut一样,截取符合条件的列,grep是截取符合条件的行

在这里插入图片描述

如上图用cut截取df -h的第五列,它会认为每一个空格符就是一个真正的字段,所以截取的是一个空。所以cut是不能在空格作为分隔符的文件内容当中或者命令输出结果当中来进行截取操作。它只能识别tab或者具体的分隔符比如冒号,如果想截取空格作为分隔符的文件内容的话,必须用awk命令

cut有的功能awk都有,只是awk用法特别复杂,能用cut就用cut

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

如上图没写条件就代表任何条件都执行,$2代表这个文件第二列,$6代表文件第6列

在这里插入图片描述
awk虽然提取列,但读取数据的时候是一行一行读入的

在这里插入图片描述

在这里插入图片描述

如上图提取出纯数字是为了后面流程控制判断语句,循环语句之类的用

在这里插入图片描述

上图 BEGIN是一个条件,意思是开始,只有满足了这个条件,动作才会执行。BEGIN的作用是在所有的数据读取之前执行它后面那条命令,然后再处理后边的数据。上图即第二个printf,它前面无条件,只要有数据就原封不动输出。

在这里插入图片描述

在这里插入图片描述

如上图FS的作用就是指定分隔符,awk默认能够识别的分隔符是制表符或者是空格,在/etc/passwd里面默认分隔符是冒号,所以专门声明

在这里插入图片描述

如上图第一行没有处理,第二行开始才处理,这是因为awk处理的时候是先读入第一行数据,然后再执行条件,也就是说在指定分隔符之前这个数据以及读入,所以第一行它认为默认是空格作为分隔字符

如果想避免上面的情况用下图

在这里插入图片描述

加一个BEGIN,先读入分隔符

在这里插入图片描述

END的作用就是所有的数据处理完之后执行一条END命令,如下两图

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

awk没有shell方便,所以学习awk掌握其字符截取作用就可,其他编程如流程控制以及,循环判断语句之类的用shell实现就行

字符截取命令之sed

sed其实不是截取命令

在这里插入图片描述

vi命令只能修改文件,但是vi不能把命令的结果直接修改,如下图,不能直接修改df结果的命令,必须将其写入一个文件才能用vi修改。而sed支持管道符操作,所以不光可以修改文件的内容,还可以直接修改命令的结果,这是vised最主要的区别

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

上图的字符替换不影响文件本身,若想改变文件本身加-i如下图

在这里插入图片描述

sed最主要作用就是处理命令输出,不要写入文件,如果需要修改文件内容最好还是用vi

如果s前面没加行号代表整篇文档

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值