[Linux ] sed文本处理和免交互

一、sed

1.1 sed是什么

sed 是一种流编辑器(stream editor),用于对文本数据进行文本转换和处理。它通常被用于在命令行中执行文本编辑任务,可以对输入的文本进行搜索、替换、删除等操作,并将结果输出。sed 是一个非交互式的文本处理工具,它按行逐步处理输入流的数据。

1.2 基本用法

格式:
sed [选项] '语法' [标准输入]
sed选项
选项 含义
-n 关闭自动打印
-i 实际修改文本的内容
-r 显示扩展正则表达式
-i.bak 实际修改前先备份源文件
-e 多点编辑

注意:

-ir 不支持
-i -r 支持
-ri   支持

-ni   会清空文件

 默认打印已输入的内容

[Linux ] sed文本处理和免交互_第1张图片

查看文件内容

[Linux ] sed文本处理和免交互_第2张图片 重定向

[Linux ] sed文本处理和免交互_第3张图片

管道符

[Linux ] sed文本处理和免交互_第4张图片 1.3 搜索替代

s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###
替换修饰符:
g 行内全局替换
p 显示替换成功的行
w   /PATH/FILE 将替换成功的行保存至文件中
I,i   忽略大小写

 简单用法

[Linux ] sed文本处理和免交互_第5张图片

高级用法 

[Linux ] sed文本处理和免交互_第6张图片 分组查找替换

格式
sed 's//\/'

[Linux ] sed文本处理和免交互_第7张图片

 分组后向引用

提取ens33的IP地址

 提取文件的权限(要求数字)

[Linux ] sed文本处理和免交互_第8张图片

提取网卡名

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'

[Linux ] sed文本处理和免交互_第9张图片

 提取版本号

用sed提
[root CXK /opt] cat test |sed -rn 's/.*-(.*).jar/\1/p'

[Linux ] sed文本处理和免交互_第10张图片

用grep提
cat test |grep -e "[0-9]\+\."

[Linux ] sed文本处理和免交互_第11张图片 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 替换
! 取反
= 显示行号

[Linux ] sed文本处理和免交互_第12张图片

选项关闭自动打印功能

[Linux ] sed文本处理和免交互_第13张图片 直接显示第三行

显示最后一行

 正则表达式

[Linux ] sed文本处理和免交互_第14张图片

显示范围

[Linux ] sed文本处理和免交互_第15张图片 [Linux ] sed文本处理和免交互_第16张图片

匹配两个正则表达式之间的行

基本格式     '/表达式1/,/表达式2/p' (不要忘记打印)p  文件名

[Linux ] sed文本处理和免交互_第17张图片 显示从几点几分到几点加分的日志

sed '/10:40/,/11:30/p' /var/log

删除

[Linux ] sed文本处理和免交互_第18张图片

[Linux ] sed文本处理和免交互_第19张图片 [Linux ] sed文本处理和免交互_第20张图片

追加

[Linux ] sed文本处理和免交互_第21张图片 [Linux ] sed文本处理和免交互_第22张图片

取反

[Linux ] sed文本处理和免交互_第23张图片 1.5 变量

[Linux ] sed文本处理和免交互_第24张图片 

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 <

[Linux ] sed文本处理和免交互_第25张图片

tee <

[Linux ] sed文本处理和免交互_第26张图片

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:

[Linux ] sed文本处理和免交互_第27张图片

[Linux ] sed文本处理和免交互_第28张图片

验证

[Linux ] sed文本处理和免交互_第29张图片 [Linux ] sed文本处理和免交互_第30张图片

实验2: 

[Linux ] sed文本处理和免交互_第31张图片

[Linux ] sed文本处理和免交互_第32张图片

总结:

1.sed 命令是一个流编辑器,可以逐行读取文件,也可以执行命令操作,因此如果文件过大,有必要先将其分割,然后再传递给 sed 进程。

2.sed -r 是正则表达式"Ⅾ{n}Ⅾ{n,m}Ⅾ"的扩展,去掉了"Ⅾ"。

3.使用 -i 命令时,一定要先备份(尤其是重要文件)或做实验,确保没有错误后再使用 -i。

4.sed 命令集中于四种功能--添加、删除、更改和检查,在脚本中用于更改设置或添加重要文件时特别有效。

5.交互式操作对用户实施单一设置很有用,但在面对批量配置时需要脚本访问免交互类型的脚本来解决其实施问题。

6.对于检查工具的使用,应修改脚本解释器语句,或使用嵌入式(但不适合 ssh、su 等能够改变运行环境的嵌入式交互场景命令)。

7.编写无交互脚本,需要首先考虑交互过程中所有可能的交互要素,以保证脚本的实用性和完整性。

你可能感兴趣的:(Linux,linux,运维,服务器)