Shell编程之Sed
一、Sed工具概述
1、Sed概念
Sed(Stream EDitor)是一个强大而简单的文本解析转换工具可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行。sed也可以在无交互的情况下实现相当复杂的文本处理操作,被广泛应用于Shell脚本中,用以完成各种自动化处理任务。
2、Sed工作流程
Sed流程主要包括(1)读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。 (2)执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行。(3)显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
3、Sed数据处理原理
二、Sed基本用法
sed [option]... 'script;script;...' [input file...]
sed [选项] '操作' 参数
1、常用选项
-e 表示用指定命令或者脚本来处理输入的文本文件,只有一个编辑命令时可省略
-f 表示用指定的脚本文件来处理输入的文本文件
-n 表示仅显示处理后的结果
-i.bak 直接编辑文本文件,不输出结果
-r, -E 使用扩展正则表达式
-s 将多个文件视为独立文件,而不是单个连续的长文件流
2、常用操作
参数 | 作用 |
---|---|
a | 增加,在当前行后面加一行指定内容 |
c | 替换,将选定行替换为指定内容 |
d | 删除,删除选定的行 |
i | 插入,在选定行前面插入一行指定内容 |
p | 打印,输出指定行 |
s | 替换,替换指定字符、格式:“行范围 s/旧字符串/新字符串” |
y | 字符转换 |
r | 指定读取文件 |
三、Sed用法
1、输出指定的行
sed -n 'p' test.bak //输出所有内容,等同于 cat test.txt
sed -n '3p' test.bak //输出第 3 行
sed -n '3,5p' test.bak //输出 3~5 行
sed -n 'p;n' test.bak //输出所有奇数行,n 表示读入下一行资料
sed -n 'n;p' test.bak //输出所有偶数行,n 表示读入下一行资料
sed -n '1,5{p;n}' test.bak //输出第 1~5 行之间的奇数行(第 1、3、5 行)
sed -n '10,${n;p}' test.bak //输出第 10 行至文件尾之间的偶数行
sed -n '2,+3p' test.bak //从第2行开始,连续3行进行输出,即输出2~5行
sed -n '$p' test.bak //提取最后一行
ifconfig ens33 | sed -n '2p' //提取IP地址
ifconfig ens33 | sed -n '2!p' //提取除了第二行的内容
seq 10 |sed -n '1~2p' //打印奇数
seq 10 |sed -n '0~2p' //打印偶数
seq 10 |sed -n '1~2!p' //感叹号是取反意思
sed '=' test //打印行号
sed '3q' test.bak //打印前3行
sed -n '1,3p' test.bak //打印前3行
sed '/^#/d' /etc/fstab //删除以#开头的行
seq 10 |sed '2azzt' //在第2行后面添加内容
seq 10 |sed '2a\zzt' //在第2行后面添加内容
seq 10 |sed '2izzt' //在第2行前面添加内容
2、插入符合条件的行
使用插入时,如果添加多行数据,除最后一行外,每行末尾都需要用“\n”符号表示数据未完结,换行。
sed '/wangwu/i zhantai' test.bak //在含有the行的前面一行添加zhantai
sed '/wangwu/a zhantai' test.bak //在含有the行的下后面一行添加zhantai
sed '3azzt' test.bak //在第3行之后插入字符
3、替换符合条件的文本
sed 's/home/HOME/' test.bak //将每行中的第一个home 替换为 HOME
sed 's/z/Z/2' test.bak //将每行中的第 2 个 z 替换为 Z
sed 's/the/THE/g' test.bak //将文件中的所有zzt 替换为 ZZT
sed 's/o//g' test.bak //将文件中的所有o 删除(替换为空串)
sed 's/^/#/' test.bak //在每行行首插入#号
sed '/zhang/s/^/#/' test.bak //在包含zhang 的每行行首插入#号
sed '5,6s/bin/BIN/g' test.bak //将第 3~5 行中的所有 bin 替换为 BIN
sed -i.bak '7cSELINUX=123' /etc/selinux/config //将这个文件的selinux=disabled替换为selinux=123,7是第7行
sed 's/SELINUX=disabled/SELINUX=enable/' /etc/selinux/config
先备份再修改数据