锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

32三剑客sed

时间:2022-10-01 10:30:00 电子台秤传感器yzo

文本处理器

在Linux/UNIX该系统包括多种文本处理器或文本编辑器,包括我们以前学过的东西VIM编辑器与grep等。而grep,sed,awk更是shell文本处理工具常用于编程,被称为shell编程三剑客

sed工具

sed (Stream EDitor)它是一种强大而简单的文本分析转换工具,可以读取文本,并根据指定的条件编辑文本内容(删除、替换、添加、移动等),最终输出所有行或只输出处理的行。sed它还可以在没有交互的情况下实现相当复杂的文本处理操作,广泛应用于shell脚本用于完成各种自动化处理任务。

sed的工作流程

主要包括读取、执行和显示三个过程。
读取:sed读取一行内容,从输入流(文件、管道、标准输入)中存储到临时缓冲区(也称模式空间),pattern space)。
执行:默认情况下,一切sed命令在模式空间中顺序执行,除非指定行的地址,否则sed命令将在所有行上依次执行。
显示:将修改后的内容发送到输出流。发送数据后,模式空间将被清空。上述过程将重复执行,直到所有文件完成。
注:默认情况下的一切sd除非使用重定向存储输出,否则所有命令都在模式空间内执行,因此输入的文件不会发生任何变化。

sed常用命令

通常调用sed命令有两种格式,如下所示。其中,参数是指当有多个操作对象时,操作操作对象时,文件之间使用逗号scriptfile表示脚本文件,需要使用-f选项指定,当脚本文件出现在目标文件之前时,表示输入的目标文件是通过指定的脚本文件处理的。
sed[选项] 操作,参数
sed[选项]-f scriptfile参数

常见的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:字符转换。

2.用法示例
还在这一节test.txt以示例演示文件。
(1)输出符合条件的文本(p表示正常输出)

sed -n ‘p’ test.txt///输出所有内容等于 cat test.txt

sed -n 2p#直接显示第二行内容

sed -n 'p;n’test.txt///输出所有奇数行,n表示读入下一行资料
sed -n 'n;p’test.txt///输出所有偶数行,n表示读入下一行资料
sed-n’1,5[p;n}'test.txt//输出第1~五行之间的奇数行
sed-n’10,${n;p}'test.txt///输出第10行到文件尾之间的偶数行

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-wVaBB5Mb-1657531248188)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220707150927406.png)]

以上是sed命令的基本用法,sed当命令与正则表达式相结合时,格式略有不同,正则表达式为"/"包围。以下操作是sed使用命令与正则表达式相结合的示例。

sed -n ‘/the/p’ test.txt //包含输出the 的行
sed -n ‘4,/the/p’ test.txt ///输出从第 4 第一第一包含 the 的行
sed -n ‘/the/=’ test.txt//包含输出the 行号,等号(=)用于输出行号
sed -n ‘/^PI/p’ test.txt //输出以PI 开头的行
sed -n ‘/[0-9]$/p’ test.txt ///以数字结尾输出行

sed -n ‘//p’ test.txt //输出包含单词wood 的行,<、>代表单词边界

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-b6NArqTu-1657531248189)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220707092235398.png)]

拓展

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-UPCk3yzO-1657531248189)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220707092650204.png)]

(2)删除符合条件的文本(d)
nl 用于计算文件行数的命令,结合命令可以更直观地查看命令执行的结果。

nl 1.txt | sed ‘3d’ //删除第 3 行
nl test.txt | sed ‘3,5d’ //删除第 3~5 行
nl test.txt |sed ‘/cross/d//删除包含 cross 行,原来的第 8 删除行被;如果要删除,不包括 cross 行,用!符号表示反向操作, 如’/cross/!d’
sed ‘/1/d’ test.txt ///以小写字母开头删除行

sed ‘/.$/d’ test.txt //删除以"."结尾的行

sed ‘/^$/d’ test.txt ///删除所有空行(如果 是 删 除 重 复 的 空行 , 即 连 续 的 空 行 只 保 留 一 个 , “cat -s test.txt”)

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-4X15S5kj-1657531248189)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220707153114800.png)]

(3)替换合格文本
在使用 sed 替换命令时需要使用 s(字符串替换),c(整行/整块替换),y常用的命令选项如下所示。

sed ‘s/the/THE/’ test.txt////每行第一the 替换为 THE
sed ‘s/l/L/2’ test.txt///每行第一 2 个 l 替换为 L
sed ‘s/the/THE/g’ test.txt//将文件中的所有the 替换为 THE

sed ‘s/o//g’ test.txt//文件中的一切o 删除(替换为空串)
sed ‘s/^/#/’ test.txt///每行首插入#号
sed ‘/the/s/^/#/’ test.txt//在包含the 每行首插入#号
sed ‘s/$/EOF/’ test.txt///每行尾插入字符串EOF
sed ‘3,5s/the/THE/g’ test.txt//将第 3~5 行中的所有 the 替换为 THE
sed ‘/the/s/o/O/g’ test.txt//将包含the 所有行中的 o 都替换为 O

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-wrslR6yW-1657531248190)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220707161037795.png)]

==实际操作(修改配置文件)==sed -i ‘s/SELINUX= disabled/ SELINUX=enable /’ /etc/selinux/config

(4)迁移合格文本
在使用 sed 下列参数常用于命令迁移符合条件的文本.
H:将剪贴板复制;
g、G:将剪贴板中的数据覆盖/添加到指定行;
w:保存为文件;
r:读取指定文件;
a:增加指定内容。具体操作方法如下。
I,i 忽略大小写

sed ‘/the/{H;d};$G’ test.txt //将包含the 行迁移到文件末尾,{;}用于多个操作
sed ‘1,5{H;d};17G’ test.txt //将第 1~5 将行内容转移到第一位 17 行后
sed ‘/the/w out.file’ test.txt //将包含the 行另存为文件 out.file
sed ‘/the/r /etc/hostname’ test.txt ////etc/hostname 的内容添到包含 the 的每行以后
sed ‘3aNew’ test.txt //在第 3 行后插入一个新行,内容为New
sed ‘/the/aNew’ test.txt //在包含the 的每行后插入一个新行,内容为 New
sed ‘3aNew1\nNew2’ test.txt //在第 3 行后插入多行内容,中间的\n 表示换行

(5)使用脚本编辑文件
使用 sed 脚本将多个编辑指令存放到文件中(每行一条编辑指令),通过“-f”选项来调用。例如执行以下命令即可将第 1~5 行内容转移至第 16 行后。

sed ‘1,5{H;d};16G’ test.txt //将第 1~5 行内容转移至第 16 行后
(6)sed 直接操作文件示例
编写一个脚本,用来调整 vsftpd 服务配置,要求禁止匿名用户,但允许本地用户(也允许写入)。

expect

建立在tcl语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互相关的问题。
expect主要的作用:
1、追踪需要交互的指令,捕捉关键词
2、传入交互指令回车执行
expect的安装
expect它是一个程序,所以它也是需要提前安装才可以使用的
rpm -q expect
rpm -q tcl
yum -y install expect//yum或者光盘安装都可

基本命令:
(1)脚本解释器
expect脚本中首先引入文件,表明使用的是哪一个shell。
#!/usr/bin/expect
(2)spawn(追踪)
spawn后面通常跟一个Linux执行命令,表示开启一个会话、启动进程,并跟踪后续交互信息。
例:spawn passwd root
(3)expect
判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回;只能捕捉由sP酒启动的进程的输出;用于接收命令执行后的输出,然后和期望的字符串匹配。
(4)send(交互)
向进程发送字符串,用于模拟用户的输入;该命令不能自动回车换行,一般要加\r(回车)或者\n
例:
#!/bin/bash
#!/usr/bin/expect
spawn passwd root
方式一:expect"密码"{send"abc123\r"}#同一行send部分要有{}
方式二:expect"密码:"
send “abc123\r” #换行send部分不需要有{}
方式三:expect支持多个分支
expect#只要匹配了其中一个情况,执行相应的send语句后退出该expect语句
“密码1”(send"abc123\r"}
“密码2”{send"123456\r"}
“密码3”(send"123123\r")

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cXMl5ksu-1657531248190)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220711171550013.png)]

(5)结束符expect_eof
表示交互结束,等待执行结束,退回到原用户,与spawn.对应。比如切换到root用户,expect脚本默认的是等待10s,当执行完命令后,默认停留10s后,自动切回了原用户interact执行完成后保持交互状态,把控制权交给控制台,会停留在目标终端而不会退回到原终端,这个时候就可以手工操作了,interact后的命令不起作用,比如interact后添加exit,并不会退出root用户。而如果没有interact则登录完成后会退出,而不是留在远程终端上。使用interact会保持在终端而不会退回到原终端,比如切换到root用户,会一直在root用户状态下;比如ssh到另一服务器,会一直在目标服务器终端,而不会切回的原服务器。
注意:expect eof与interact只能二选一。
exp_continue
附加于某个expect判断项之后,可以使该项被匹配后,还能继续匹配该expect-判断语句内的其他项。exp_continue类似于控制语句中的continue语句。表示允许expect继续向下执行指令。
注意:使用exp continuel时,如果跟踪像passwd这样的输入密码后就结束进程的命令,expect()外不要再加上expect eof因为spawni进程结束后会默认向expect发送eof,会导致后面的expect eof:执行报错
注:表示允许用户进行交互操作,一直保持会话连接

远程免交互登录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-El3XXhIs-1657531248190)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220711162152962.png)]
踪像passwd这样的输入密码后就结束进程的命令,expect()外不要再加上expect eof因为spawni进程结束后会默认向expect发送eof,会导致后面的expect eof:执行报错
注:表示允许用户进行交互操作,一直保持会话连接

远程免交互登录

[外链图片转存中…(img-El3XXhIs-1657531248190)]


  1. a-z ↩︎

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章