文本三剑客——sed【转】
sed
sed处理的是行
sed 不打开文件的情况下更改文件的内容
sed 自己的语法:输出哪些行,留下哪些行
语法:范围+操作
sed命令的选项 -i:实际修改文件内容 -i.bak:实际修改前先备份原文件,会产生一个源文件.bak的文件 -n:关闭自动打印 -r:使用扩展正则表达式 语法字母在单引号中 -p:打印 -q:提前退出 3q 打印到第三行退出 -d:删除 3d 删除第三行 -a:后面追加 3a 第三行后面添加 -i: 上面插入 3i 第三行上面添加 -c: 替换 3c将第三行的内容替换 =:行号
sed取奇偶数
#提取奇数行,打印第一行内容,返回第二行内容
#提取偶数行,返回第一行内容,打印第二行内容
同时sed还可以打印两个正则表达式之间的行
比如这里我想提取b开头和f开头中间的行
#将cat的结果传给sed,sed在根据要求打印内容
如果有多个复合条件的表达式时
会在找b开的和f开头的内容后,在重新查找b开头的内容,一直找到有f开头的行,如果没有f开头的行,就全部显示
sed可以在不打开文件的情况下,修改文件的内容
#这个文件夹中只有这10个数字
#可以看到我们先是将源文件中的偶数行去除,然后又在第二行后追加了一个haha
搜索替代:
标准姿势: s/旧内容/新内容/修饰符 也可以表示为 s#旧内容#新内容#修饰符 或 s@旧内容@新内容@修饰符 修饰符: g 行内全局替换 p 显示替换成功的行 w 将替换成功的行保存至文件中 i,I 忽略大小写
替换练习
将该内容中的SELINUX=enforcing替换成SELINUX=enable
#在更改一个文件之前,一定要记得备份,以防万一
可以使用i.bak备份文件
#使用i.bak备份文件,会在目录中新建一个以.bak结尾的备份文件,该文件和源文件相同
#打印passwd文件中含有$name的行
$name=root
-r:表示使用拓展正则表达式
分组后项引用
只有扩展正则表达式才能支持分组
练习1:
提取网卡信息,只提取图中画圈IP地址
#.*inet:表示图中inet前的空格
#(.*):第二个.*表示IP地址,打上括号表示他为一组
#netmask.*:表示图中netmask向后的内容
#然后提取第一组内容就可以得到我们需要的IP地址
练习2:
提取图中的版本号数字部分
#以-为分隔符提取.jar前的内容
练习3:
提取文件权限的数字部分
#提取范围是第四行,提取括号内连续的4个数字
免交互
多行重定向
cat >目标文件 <<eof
eof
#可以多行同时传到指定的文件
#目标文件的位置可以在eof前,也可以在eof后
expect
可以解决shell脚本中交互的相关问题
需要下载
yum install expect -y
#相关关键词 spawn 开启免交互 开启expect expect 捕捉 屏幕上的 关键词 exp_continue 继续捕捉屏幕上的字 send 发送指令 interact 代表退出 expect 但是会留在新的终端 expect eof 代表退出 ecpect 默认 10s后 返回旧的终端 set 设置变量
expect脚本不可以使用bash解释器
#!/usr/bin/expect
转自
文本三剑客——sed - 打开方式不对 - 博客园
https://www.cnblogs.com/chenjw0608/p/17862716.html