前言:
Shell三剑客是grep、sed和awk三个工具的简称,因功能强大,使用方便且使用频率高,因此被戏称为三剑客,熟练使用这三个工具可以极大地提升运维效率。
sed是一个流编辑器,用于对文本进行编辑、替换、删除等操作。sed通过读取、执行和显示三个过程来工作,可以在无交互的情况下实现复杂的文本处理操作。
一、sed命令参数描述
1.sed命令选项
-n 不打印所有行到标准输出
-e 表示将下一个字符串解析为sed命令,如果只传递一个编辑命令给sed,-e选项可以省略
-f 表示正在调用sed脚本文件
2.sed命令定位文本的方法
x x为指定行号
x,y 指定从x到y的行号范围
/pattern/ 查询包含模式的行
/pattern/pattern/ 查询包含两个模式的行
/pattern/,x 从与pattern的匹配行到x号行之间的行
x,/pattern/ 从x号行到与patter匹配的行之间的行
x,y! 查询不包括x和y行号的行
3.sed编辑命令
p 打印匹配行
= 打印文件行号
a\ 在定位行号之后追加文本信息
i\ 在定位行号之前插入文本信息
d 删除定位行
c\ 用新文本替换定位文本
s 使用替换模式替换相应模式
r 从另一个文件中读文本
w 将文本写入到一个文件
y 变换字符
q 第一个模式匹配完成后推出
l 显示与八进制ACSII码等价的控制字符
{} 在定位行执行的命令组
n 读取下一个输入行,用下一个命令处理新的行
h 将模式缓冲区的文本复制到保持缓冲区
H 将模式缓冲区的文本追加到保持缓冲区
x 互换模式缓冲区和保持缓冲区的内容
g 将保持缓冲区的内容复制到模式缓冲区
G 将保持缓冲区的内容追加到模式缓冲区
二、sed应用举例
1.sed命令选项举例
sed编辑命令p实现打印匹配行,-n表示不打印所有行
#查看文件全部内容
[root@test02 ~]# cat a.txt
#sfsd
fsjdf
fdfs#执行sed命令带-n选项,只打印文本第一行
[root@test02 ~]# sed -n '1p' a.txt
#sfsd#执行sed命令不带-n选项,打印文本第一行和文本全部内容
[root@test02 ~]# sed '1p' a.txt
#sfsd
#sfsd
fsjdf
fdfs#打印范围行,1到2行
[root@test02 ~]# sed -n '1,2p' a.txt
#sfsd
fsjdf#利用/pattern/进行模式匹配,且匹配是大小写敏感的
[root@test02 ~]# sed -n '/fsjdf/p' a.txt
fsjdf
[root@test02 ~]# sed -n '/sfsd/p' a.txt
#sfsd
sed -e用法
#-e表示将下一个字符串解析为sed编辑命令,如果只传递一个编辑命令给sed,-e选项可以忽略。
#只有项sed传递多个编辑命令时,-e才有用武之地#打印行号命令
[root@test02 ~]# sed -n '/sfsd/=' a.txt
1
[root@test02 ~]# sed -n '/fsjdf/=' a.txt
2
#打印行的内容及行号
[root@test02 ~]# sed -n -e '/fsjdf/p' -e '/fsjdf/=' a.txt
fsjdf
2
sed -f选项
#-f选项只有调用sed脚本文件时才起作用,
#追加文本格式
#sed '指定地址a\追加文本' 操作文件[root@test02 ~]# cat append.sed
#!/bin/sed -f
/my/a\
we append a new line#在my关键字这一行之后追加文本
[root@test02 ~]# ./append.sed a.txt
#sfsd
what is your name
my name is Andy Law
we append a new line
zhen ta ma caodan!
fsjdf
fdfsaaaa
2.sed文本定位举例
匹配元字符需使用转义字符“\”
#匹配元字符
[root@test02 ~]# sed -n '/\!/p' a.txt
zhen ta ma caodan!
#sed命令可以正则表达式可以匹配元字符,$正则中表示行尾,sed中表示最后一行,最后一行为空行
[root@test02 ~]# sed -n '$p' a.txt#打印1到2行之外的行
[root@test02 ~]# sed -n '1,2!p' a.txt
my name is Andy Law
zhen ta ma caodan!
fsjdf
fdfs#打印匹配关键字my到最后一样
[root@test02 ~]# sed -n '/my/,$p' a.txt
my name is Andy Law
zhen ta ma caodan!
fsjdf
fdfsaaaa
#打印第2行到my关键字匹配的行
[root@test02 ~]# sed -n '2,/my/p' a.txt
what is your name
my name is Andy Law
3.sed基本编辑命令举例
插入命令i\
#sed编辑命令插入文本的符号为i\,插入文本的格式为:
sed '指定地址i\插入文本' 输入文件[root@test02 ~]# cat insert.sed
#!/bin/sed -f
/my/i\
we insert a new line [root@test02 ~]# ./insert.sed a.txt
#sfsd
what is your name
we insert a new line
my name is Andy Law
zhen ta ma caodan!
fsjdf
fdfsaaaa
修改文本 c\
#sed编辑命令的修改文本符号为c\,格式为:
sed '指定地址c\更换文本' 输入文件[root@test02 ~]# cat modify.sed
#!/bin/sed -f
/my/c\
we modify this line
[root@test02 ~]# ./modify.sed a.txt
#sfsd
what is your name
we modify this line
zhen ta ma caodan!
fsjdf
fdfsaaaa
删除文本d
#sed编辑命令删除文本符号为d,格式为:
sed '指定地址d' 操作文件[root@test02 ~]# cat a.txt
#sfsd
what is your name
my name is Andy Law
zhen ta ma caodan!
fsjdf
fdfsaaaa
[root@test02 ~]# sed '2d' a.txt
#sfsd
my name is Andy Law
zhen ta ma caodan!
fsjdf
fdfsaaaa
#删除最后一行
[root@test02 ~]# sed '$d' a.txt
#sfsd
what is your name
my name is Andy Law
zhen ta ma caodan!
fsjdf
fdfs
#删除5到最后一行
[root@test02 ~]# sed '5,$d' a.txt
#sfsd
what is your name
my name is Andy Law
zhen ta ma caodan!
替换文本s
#sed编辑命令替换文本的符号为s,格式为:
sed 's/被替换文本/新替换文本/[替换选项]' 输入文本g 表示替换文本中所有出现被替换字符串之处
p 与-n选项结合,只打印替换行
w 文件名 表示将输出定向到一个文件[root@test02 ~]# sed 's/my/your/' a.txt
#sfsd
what is your name
your name is Andy Law
zhen ta ma caodan!
fsjdf
fdfsaaaa
写入一个新的文件
#写入文本符号w,格式为:
sed '指定地址 w 文件名' 操作文件#将a.txt文件1到3行生成新文件输入到nuw.txt
[root@test02 ~]# sed -n '1,3 w new.txt' a.txt
[root@test02 ~]# cat new.txt
#sfsd
what is your name
my name is Andy La[root@test02 ~]# sed -n '/my/ w new.txt' a.txt
[root@test02 ~]# cat new.txt
my name is Andy Law