一、sed
1.1 sed是什么
sed
是一种流编辑器(stream editor),用于对文本数据进行文本转换和处理。它通常被用于在命令行中执行文本编辑任务,可以对输入的文本进行搜索、替换、删除等操作,并将结果输出。sed
是一个非交互式的文本处理工具,它按行逐步处理输入流的数据。
1.2 基本用法
格式:
sed [选项] '语法' [标准输入]
选项 | 含义 |
-n | 关闭自动打印 |
-i | 实际修改文本的内容 |
-r | 显示扩展正则表达式 |
-i.bak | 实际修改前先备份源文件 |
-e | 多点编辑 |
注意:
-ir 不支持
-i -r 支持
-ri 支持
-ni 会清空文件
默认打印已输入的内容
查看文件内容
重定向
管道符
1.3 搜索替代
s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###
替换修饰符:
g 行内全局替换
p 显示替换成功的行
w /PATH/FILE 将替换成功的行保存至文件中
I,i 忽略大小写
简单用法
高级用法
分组查找替换
格式
sed 's//\/'
分组后向引用
提取ens33的IP地址
提取文件的权限(要求数字)
提取网卡名
echo /etc/sysconfig/network-scripts/ifcfg-ens33 | sed -n 's@.*/\([^/]*\)$@\1@p'
echo "/etc/sysconfig/network-scripts/ifcfg-ens33"|sed -nr 's#^.*\/(.*)#\1#p'
echo /etc/sysconfig/network-scripts/ifcfg-ens33 |sed -nr 's@^(.*)/([^/]+)@\2@p'
提取版本号
用sed提
[root CXK /opt] cat test |sed -rn 's/.*-(.*).jar/\1/p'
用grep提
cat test |grep -e "[0-9]\+\."
1.4 脚本格式
sed ' '单引号里面要写脚本
脚本格式如下
1. 不给地址:对全文进行处理(比如行号)
2. 单地址:
#:指定的行,$:最后一行
/pattern/:被此处模式所能够匹配到的每一行,正则表达式
3. 地址范围:
#,# #从#行到第#行,3,6 从第3行到第6行
#,+# #从#行到+#行,3,+4 表示从3行到第7行
/pat1/,/pat2/ 第一个正则表达式和第二个正则表达式之间的行
#,/pat/ 从#号行为开始找到 pat为止
/pat/,# 找到#号个pat为止
4. 步进:~
1~2 奇数行
2~2 偶数行
sed -n 'n;p' testfile1 #打印偶数行
ed -n '2,${n;p}' testfile1
符号 | 含义 |
p | 手动打印 |
q | 提前退出 |
d | 删除 |
a | 后面追加 |
i | 上面插入 |
c | 替换 |
! | 取反 |
= | 显示行号 |
选项关闭自动打印功能
直接显示第三行
显示最后一行
正则表达式
显示范围
匹配两个正则表达式之间的行
基本格式 '/表达式1/,/表达式2/p' (不要忘记打印)p 文件名
显示从几点几分到几点加分的日志
sed '/10:40/,/11:30/p' /var/log
删除
追加
取反
1.5 变量
1. 6 修改网卡名
vim /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
#GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet net.ifnames=0"
#修改这行
GRUB_DISABLE_RECOVERY="true"
sed -ri.bak '/^GRUB_CMDLINE_LINUX/s#(.*)"$#\1 net.ifnames=0"#' /etc/default/grub
sed -ri.bak '/^GRUB_CMDLINE_LINUX/s#"$#net.ifnames=0"#' /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg
二、免交互
2.1 多行重定向
cat >test <<tof
tee <<eof
2.2 expecp
要先安装expect软件
rpm -q expect
yum -y install ecpect
格式
expect [选项] [ -c cmds ] [ [ -[f|b] ] cmdfile ] [ args ]
脚本格式
#!/usr/bin/expect
spawn #开启免交互 开启expect
expect #捕捉屏幕上的关键字
exp_continue #继续捕捉屏幕上的字
send #发送指令
insteract #代表退出expect但是会留在新终端
expect eof 代表退出expect ,默认保留10s然后退出
实验1:
验证
实验2:
总结:
1.sed 命令是一个流编辑器,可以逐行读取文件,也可以执行命令操作,因此如果文件过大,有必要先将其分割,然后再传递给 sed 进程。
2.sed -r 是正则表达式"Ⅾ{n}Ⅾ{n,m}Ⅾ"的扩展,去掉了"Ⅾ"。
3.使用 -i 命令时,一定要先备份(尤其是重要文件)或做实验,确保没有错误后再使用 -i。
4.sed 命令集中于四种功能--添加、删除、更改和检查,在脚本中用于更改设置或添加重要文件时特别有效。
5.交互式操作对用户实施单一设置很有用,但在面对批量配置时需要脚本访问免交互类型的脚本来解决其实施问题。
6.对于检查工具的使用,应修改脚本解释器语句,或使用嵌入式(但不适合 ssh、su 等能够改变运行环境的嵌入式交互场景命令)。
7.编写无交互脚本,需要首先考虑交互过程中所有可能的交互要素,以保证脚本的实用性和完整性。