一、sed编辑器
■ sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的—组规则来编辑数据流
■ sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中
1、sed的工作流程主要包括读取、执行和显示三个过程:
-
读取: sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space )
-
执行: 默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行
-
显示: 发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完
注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出
2、sed命令格式:
1.sed -e '操作' 文件1 文件2 ...
2.sed -n -e '操作'文件1 文件2 ...
3.sed -f 脚本文件 文件1 文件2 ...
4.sed -i -e '操作' 文件1 文件2 ...
sed -e 'n{
操作1
操作2
...
}’ 文件1 文件2 ...
3、常用选项:
选项 | 作用 |
---|---|
-e | 表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用 |
-n | 关闭自动打印(一般和p一起使用) |
-r | 使用扩展正则表达式 |
-i | 直接修改文件内容,建议先备份 |
-i.bak | 备份文件,会产生一个源文件.bak的文件 |
4、常用操作:
选项 | 含义 |
---|---|
p | 手动打印 ,例:3p,打印到第三行 |
q | 提前退出,例:3q,到第三行退出 |
d | 删除,例:3d,删除第三行 |
a | 指定,例:3ahh,在第三行后加入hh |
i | 上面插入,例:3ihh,在第三行前插入hh |
c | 替换,例:3chh,将第三行替换成hh |
= | 显示行号 |
二、打印内容
sed -n 'p' test #按顺序打印出内容
sed -n '=' test
sed -n -e '=' -e 'p' test(打印出内容并显示行号,-e的用法用于执行多个操作命令的时候使用)
三、过滤
sed编辑器有2种过滤方式:
- 以数字形式表示行区间
- 用文本模式来过滤出行
以数字形式表示行区间
sed -n '1p' test #过滤并打印出第一行的内容
sed -n '$p' test #打印最后一行
sed -n '1,3p' test #打印出第一排到第三排的内容
sed -n 'n;p' test 打印出偶数行,n表示移动到下一行
sed -n 'p;n' test 打印出奇数行,n表示移动到下一行
sed -n '2,${n;p}' test 从第二行开始执行但不包括第二行
用文本模式过滤出行
sed -n '/user/p' /etc/passwd #过滤出含有user的行
sed -n '/^a/p' /etc/passwd #打印出以a为开头的行
sed -n '/bash$/p' /etc/passwd #打印出以bash结尾的行
sed -n '/ftp\|root/p' /etc/passwd #打印出含有/root或者/ftp的行
sed -nr '/ftp|root/p' /etc/passwd #或者加r,代表支持正则表达式
sed -n '2,/ftp/{=;p}' /etc/passwd #从第2行开始打印直到打印出ftp
四、删除
sed '2d' test #删除第2行
sed '2,4d' test #删除2-4行
sed '$d' test #删除最后一行
sed '/^$/d' test #删除空格
sed 'd' test #全部删除
sed '/d$/d' test #删除以d结尾的行
sed '/d$/!d' test #!取反,删除除了以d结尾的行
sed '/a/,/c/d' test
#删除从a开头的到c开头的,不论a-c之间有多少行都会被删除,直到匹配不到为止
五、搜索替代
格式:sed 行范围 s/旧字符串/新字符串/替换标记
4种替换标记:
- 数字: 表明新字符串将替换第几处匹配的地方
- g: 表明新字符串将会替换所有匹配的地方
- P: 打印与替换命令匹配的行,与-n一起使用
- w 文件: 将替换的结果写到文件中
sed -n 's/root/admin/p' /etc/passwd #在etc/passwd里root替换成admin(默认更换一个root)
sed -n 's/root/admin/2p /etc/passwd #2p,表面要替换这行的第几个匹配的地方
sed -n 's/root/admin/gp' /etc/passwd #替换到全局所有的root,修改全局后面加g
sed 's/root//g' /etc/passwd #删除当前行含有的所有root
sed -n 's/r..t/&er/g' test #将test里凡是带r..t的字段后面都加上er
六、插入
sed ’/aa/c xxx' test #将第一行的aa替换成xxx,c默认是替换第一行
sed '3c hhh' test #将第三行,全部替换成hhh
sed '1,3a 6666' test #在1-3行的下面增加6666
sed '1,3i 6666' test #在1-3行上面增加6666
sed '2r /opt/hyh' test #r读入,在第二行下面,读入opt下的hyh文件内容
七、变量
sed -nr "/$name/p" /etc/passwd 提取变量用户名
变量需要加双引号
八、分组调用
只有扩展正则表达式才能支持分组。
分组使用()(),调用第一段使用\1
echo 11aaxx |sed -r 's/(11)(aa)(xx) /\1/' #调用第一组
11
echo 11aaxx |sed -r 's/(11)(aa)(xx) /\2/' #调用第二组
aa
echo 11aaxx |sed -r 's/(11)(aa)(xx) /\1\2/' #调用第一、二组
11aa
echo 11aaxx |sed -r 's/(11)(aa)(xx) /\1\2\3/' #调用所有分组
11aaxx
提取ip地址
ifconfig ens33 |sed -rn '2s/.*(inet) ([0-9.]+) (netmask) ([0-9.]+) (broadcast) ([0-9.]+).*/\2/p'
192.168.116.40
-rn :使用扩展正则表达式要用-r
2s/:取第二行
.*(inet):取第一组
+:+代表不管后面有多少个都显示
免交互
1.多重重定向
cat << EOF #手动往EOF里添加内容
cat <<EOF >test #把EOF里添加的内容加进test里
tee自带重定向功能
tee > 2.test #将手写内容加入2.test文件里
2.expect
要先yum安装expect
制作免交互脚本传文件
基本命令:
1.脚本解释器
expect 脚本中首先引入文件,表明使用的事哪一种shell
#!/usr/bin/expect
2.spawn
spawn 后面通常跟一个Linux执行命令,表示开启一个会话、进程,并跟踪后续交互信息
后面加 命令
3.expect
判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回;只能捕捉有swpan启动的进程输出;
用于接受命令执行后的输出,然后和期望的字符串匹配
4.send
向进程发送字符串,用于模拟用户的输入:该命令不能自动回车换行,一般要加 \r (回车) 或者\ n
5.结束符
expect eof
表示交互结束,等待执行结束,退回到原用户,与spawn对应
6.set
expect 默认的超时时间是10秒,通过set 命令可以设置会话超时时间,若不限制超时时间则应设置为-1
7.exp_continue
exp_continue 表示允许 expect 继续向下执行指令.
exp_continue附加于某个expect 判断选项之后,可以是该项被匹配后还能继续匹配expect 判断语句内的其他项。exp_continue类似于控制语句的continue语句。表示允许expect继续向下执行命令。
8.send_user
表示回显命令与echo相同