第四章Shell编程之正则表达式与文本处理器

文章介绍了Linux系统中用于文本处理的三个重要工具:grep、sed和awk。grep主要用于搜索文件内容,支持基本和扩展正则表达式;sed是一个流编辑器,按行处理文本,进行内容的增删改查;awk则是一个功能强大的文本分析工具,能按指定模式处理行并取列。文章详细讲解了这些工具的使用方法和示例。

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

文本处理有三剑客:grep sed awk

通配符:只能匹配文件名与目录名,不能匹配文件的内容

*匹配任意一个或者多个字符

?匹配任意一个字符(就是匹配单个字符)

[ ] 匹配范围内的任意单个字符

正则表达式:有一类特殊字符以及文本字符所编写的一种模式,用来处理文本当中的内容,其中的一些字符不表示字符的字面含义,表示控制或者通配的功能

基本正则表达式

字符匹配,元字符

. 匹配任意的单个字符,可以是一个汉字

\表示转义符,\.就是一个点 

 ()括号表示分组的意思

\(\),就是括号

[ ] 匹配指定范围内的任意单个字符

[^]取反,指定范围之外的

[[:space:]]包含空格,tab键,换行的空格,回车的空格

[[:blank:]] 空白字符(空格和tab制表符)

通配符不能完全匹配大小写, 正则可以

 

表示匹配不是a.txt .是或者 z.txt的文件(除了不匹配a或者z,其他都匹配)

正则表达式中表示次数的表达式

*匹配前面的字符任意次,0次也行,无数次也行,有多少匹配多少,没有也行

 .*匹配任意长度的字符,至少要有一次,不包括0次

\?匹配前面的字符0次或者一次,可有可无

\+ 匹配前面的字符至少1次,最多可以无数次

\{n\}匹配前面的字符等于n次,必须连续出现才能匹配

 \{m,n\}匹配前面的字符,最少m次,最多n次

\{,n\}匹配前面的字符,最多n次(只要出现几次,出现都算,除非没有,只要前面的字符有,都算)

\{n,\}匹配前面的字符至少n次

位置锚定:

^ 以什么为开头,在模式的左侧  ^root

 $ 以什么为结尾,在模式的右侧 r$

^root$ 用于匹配整行,而且整行中只有以后个root

^$ / ^[[:space:]]$  匹配空行

 

词首锚定 \< 或者 \b

 词尾锚定 \> 或者 \b 

匹配整个单词

 分组()

\| 表示逻辑或 

扩展正则就是不写\ 

但是有要求 grep -E 或者egrep

练习一条命令显示出文件内容 

练习

显示/etc/passwd中以sh结尾的行

查找/etc/inittab中含有“以s开头,并以d结尾的单词”模式的行

查找ifconfig命令结果中的1-255之间的整数

显示/var/log/secure文件中包含“Failed”或“FAILED”的行

在/etc/passwd中取出默认shell为bash的行

高亮显示passwd文件中冒号,及其两侧的字符

以长格式列出/etc/目录下以ns开头、.conf结尾的文件信息

sed

sed:类似于vim就是一个文本编辑器,按行来编辑和处理

主要作用是对文本内容进行增删改查

sed可以支持正则表达式,支持扩展正则表达式

sed的原理:读取 执行 显示 三个过程

读取:读取文本内容后,读取到的内容存放到临时的缓冲区,模式空间

执行:在模式空间,根据读取的文本内容,按行执行,除非指定引号,否则会遍历所有行,从上往下执行

显示:执行完后,把执行结果打印,如果要改变生效,模式空间被修改的内容会写入到指定的文件当中,只是操作,但是不最终写入文件,只展示结果,展示完后,模式空间的数据立即删除

***sed 文本内容处理工具,文件过大怎么办?

1.大型文件先分割的好

2.中型文件

sed的实际操作

sed -e '操作'  文件1 -e '操作' 文件2

只对一个文件操作,可以不加-e

常用选项

-e 条件操作选项

-f 指定脚本文件来处理输入的文件内容,把命令写在脚本里,用脚本里的命令来处理第二个文件里面的内容

-i 立即生效 慎用

-n 显示script处理之后的结果(禁止sed的默认输出)

操作符

s 替换指定字符

d 删除指定的行

a,增加在当前的下面插入指定内容

i,增加,在指定行的上面插入指定的内容

c,替换,整行替换

y,替换字符,但是替换前后的字符长度必须一致

p,打印

r,扩展正则

sed的核心就是改,删 ,增 查是没有grep强大 

两种写法

 

sed自己有一个默认的输出,p打印会额外再来一行

 -n 显示script处理之后的结果(禁止sed的默认输出)

显示行号

即显示行号,也有内容

打印指定行,寻址打印

直接打印最后一行

行号的范围打印

答应1到3行

第二行到最后一行

打印2到4行

打印2行和最后一行

奇数偶数行打印

偶数

奇数

文本过滤模式

1.对包含指定字符串的内容进行打印

应用基础正则表达式进行打印

 扩展正则

***怎么样不进入文件就可以删除文件当中的内容,免交互删除?

指定行号进行删除

删除第三行,打印剩余的行

删除1到三行

删除1行和三行

匹配字符内容删除

 除了含c的,其他行删除 !:取反的意思 

正则表达式删除

删除空行

替换 

s 替换字符串

c整行替换

y,单字符替换,前后长度要保持一致

 字母字符大小写替换

首字母

全文

全部换小写

l&转换成小写的特殊符号,在使用时,需要转义符\

 u&转换成大写的特殊符号,在使用时,需要转义符\

g 全部替换,如果不加,只会更改首字符

整行替换

y单字符替换

增加

a 在下一行添加

i 在上一行添加·

r 在行后读入指定文件内容

sed命令当中字符串的位置进行交换

 后面1 2 3相当于文本内容分组之后输出的位置 谁是第一位 第二位 第三位

-f 指定脚本文件来处理输入的文件内容,把命令写在脚本里,用脚本里的命令来处理第二个文件里面的内容

空格换成下划线

文件1

脚本文件

****取版本号

取日志范围 

awk

awk,是功能最强大的文本工具,也是按行来进行操作,对行操作完之后,可以根据指定命令来进行取列

awk的分割符,他的默认分隔符是空格,或者tab键,多个空格,它会自动压缩成一个

用法:awk选项 '模式或者条件{操作}' 文件

选项:-F 指定分割符,如果是空格,则不需要加F

        -v 变量赋值

打印第一列

打印多列

 答应文本里所有内容

awk 常用内置变量

$0 打印所有内容

$n 处理行的第几列

NR 处理行的行号

NF 处理当前行的字段个数,$NF就表示最后一个字段

FS 列分割符,指定文本的分割符,和F作用一直

    F:分割符  FS=":"

OFS 输出文本的分割符

RS 输出分割符为回车

内置变量$n要加$,表示列的;其他的内置变量,不用加$,更不能用引号,也不能用括号,否则会被当成字符串处理

awk的打印功能   查看

为0不打印

默认为1,可以不加,为打印所有

只打印行号

 打印行号,打印所有内容

打印第三行

 打印1-3行

  打印1和3行

 

偶数行打印

 奇数行打印

awk运算,也支持小数运算

 **和^表示求幂

***awk的内置函数:getline

1.如果getline左右两侧没有重定向符号(<>),或者没有(|)时,awk会先读第一行,但是如果加了getline,跳过第一行,读取第二行

***如果两边有重定向或者管道符,getline作用于定向输入文件

33.txt 文件内容,重定向输出到22.txt文件

文本过滤打印

awk 以root为开头的行

 包含x的行

BEGIN模式

 在对文件进行操作之前,会先执行BEGIN{..}模式条件或者操作命令

中间{..}是真正的用于处理文件的命令

END{..}结束语句,一般都是打印执行结果

***当前文件有多少行?

-v变量赋值,指的是改变分割符

RS指定分隔符为回车

awk条件判断打印

第三列大于100的打印

 

取反

awk支持条件判断语句

 

***三元表达式,类似于java

awk '(条件表达式)?(A表达式或者值):(B的表达式或者值)'

?相当于if    :相当于else 

awk的精确筛选

 

 

 

第7列是bash的行,打印第一个字段和最后一个字段

 

 

 

 

 有几个字符可以$几,正常$1就行

 

***面试awk结合数组来进行使用,在awk中,怎么样来定义数组

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

- joke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值