shell脚本三剑客——之sed工具

在Linux/UNIX 系统中包含很多种类的文本处理器或文本编辑器,其中包括我们之前学习过的VIM 编辑器与grep 等。而 grep,sed,awk 更是Shell 编程中经常用到的文本处理工具, 被称之为Shell 编程三剑客

sed工具概述

●sed(Stream EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行。sed 也可以在无交互的情况下实现相当复杂的文本处理操作,被广泛应用于 Shell 脚本中,用以完成各种自动化处理任务。
sed 的工作流程主要包括读取、执行和显示三个过程。

●sed编辑器
sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。

◆sed命令常见用法

● sed常见的几种格式:

 sed      [选项]         '操作'    参数1,参数2,参数3
 sed      -e            '操作'   文件1 ,文件2
 sen      -n       -e   '操作'   文件1 ,文件2
 sed      -i       -e   '操作'   文件1 ,文件2     
 
 sed      [选项]      -f scriptfile    参数1,参数2,参数3
 sed      -f     脚本文件   文件1   文件2
 
 sed -e 'n{
 操作1
 操作2
 ...
 }'  文件1,文件2

其中“参数”是指操作的目标文件,当存在多个操作对象时用,文件之间用

◆sed命令选项

 ● -e 或--expression= :表示用指定命令或者脚本来处理输入的文本文件。
    执行两条命令时添加,执行一条时一般忽略
 
 ● -f 或--file= : 表示用指定的脚本文件来处理输入的文本文件。
 ● -h 或--help : 显示帮助。
 ● -n、--quiet 或 silent:表示仅显示处理后的结果。
 ● -i : 直接编辑文本文件。

 ●a : 增加,在当前行的下面增加一行指定内容
 ●c : 替换 ,将指定的“行”替换为指定内容
 ●d : 删除,删除选定的行
 ●i : 插入,在选定行上面插入一行指定内容
 ●p : 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非
      打印字符,则以ASCII码输出,其通常与“ -n ” 选项一起使用
 ●s : 替换,替换指定字符
 ●y: 字符转换,用y替换时,新字符与旧字符长度一定要相同
 ●=: 打印行号
 ●l: 打印数据流中的文本和不可打印的AscII码,比如结束符 $  制表符 \t

准备了grep.txt测试文件

[root@localhost ~]# cat sed.txt
1 1
2
3
4
5
10
20
30
40
50
#woood #
#woooooood #
#wood

全是实操命令,看完秒懂sed

◆查看文本行用法

sed -n 'p' grep.txt  打印所有内容  等同于cat
#输出第三行
[root@localhost opt]# sed -n '3p' sed.txt 
3
#输出第3-5行
[root@localhost opt]# sed -n '3,5p' sed.txt 
3
4
5
#输出第1-3行  并打印默认字符
[root@localhost opt]# sed -n '1,3l' sed.txt   
1  1$
2$
3$
#输出所有奇数行 ‘p打印;n不打印’
[root@localhost opt]# sed -n 'p;n' sed.txt  
1  1
3
5
20
40
#输出所有偶数行
[root@localhost opt]# sed -n 'n;p' sed.txt   
2
4
10
30
50
#输出第一行+下面的连续3行
[root@localhost opt]# sed -n '1,+3p' sed.txt 
1  1
2
3
4
#输出1-3行中的奇数行
[root@localhost opt]# sed -n '1,3{p;n}' sed.txt 
1  1
3
#输出2-5行的奇数行,这里第二行是第一行,所以才显示2 4 行
[root@localhost opt]# sed -n '2,5{p;n}' sed.txt    
2
4
#以下命令是正则表达式与sed命令结合的士列
#输出包含1的行
[root@localhost opt]# sed -n '/1/p' sed.txt 
1  1
10
#输出从第4行到第一个包含1的行
[root@localhost opt]# sed -n '4,/1/p' sed.txt  
4
5
10
#输出以2 3 4 开头的行
[root@localhost opt]# sed -n '/^[2-4]/p' sed.txt  
2
3
4
20
30
40
#输出以0结尾的行
[root@localhost opt]# sed -n '/0$/p' sed.txt       
10
20
30
40
50
[root@localhost opt]# sed -n '/woo*d/p' sed.txt 
#woood #
#woooooood #
#wood
#输出以w开头d结尾,中间0或多个字符的行,并打印行号
[root@localhost opt]# sed -n '/w.*d/=;/w.*d/p' sed.txt 
11
#woood #
12
#woooooood #
13
#wood

◆sed删除用法


[root@localhost opt]# sed 'd' sed.txt              全部删除,不加行号默认全删
[root@localhost opt]# sed '$d' sed.txt             删除最后一行
[root@localhost opt]# sed '/^$/d' sed.txt          删除空行

#删除3-11行
[root@localhost opt]# sed '3,11d' sed.txt      
1  1
2
#woooooood #
#wood
#删除以数字结尾的行
[root@localhost opt]# sed '/[0-9]$/d' sed.txt  
#woood #
#woooooood #
#wood

#除了以数字结尾的行,其他全都删除
[root@localhost opt]# sed '/[0-9]$/!d' sed.txt
#从第一个有1的行开始打开删除功能,一直删到第一个包含4的行结束,并且反复执行
[root@localhost opt]# sed '/1/,/4/d' sed.txt   
5
50
#woood #
#woooooood #
#wood

◆sed替换用法

● 数字:表明新字符将替换第几处匹配的结果,默认为1
●g: 表明新字符会替换所有匹配的地方
●w文件:将替换结果保存到文件中
#用QQQQQQQQ替换所有文本行中第一个1,并显示处理结果,默认只替换每行中第一个1 
[root@localhost opt]# sed -n 's/1/QQQQQQQQQQ/p' sed.txt             
QQQQQQQQQQ  1
QQQQQQQQQQ0
##用QQQQQQQQ替换所有文本行中第2个1,并显示处理结果
[root@localhost opt]# sed -n 's/1/QQQQQQQQQQ/2p' sed.txt  
1  QQQQQQQQQQ
#替换所有
[root@localhost opt]# sed -n 's/1/QQQQQQQQQQ/gp' sed.txt  
QQQQQQQQQQ  QQQQQQQQQQ
QQQQQQQQQQ0
#删除全部0-9数字
[root@localhost opt]# echo "w12ord" | sed 's/[0-9]//g'
word
#将1-20行开头全部加上#
[root@localhost opt]# sed -n '1,20 s/^/#/p' sed.txt   
#1  1
#2
#3
#4
#5
#10
#20
#30
#40
#50
##woood #
##woooooood #
##wood
#将1-20行结尾全部加上#
[root@localhost opt]# sed -n '1,20 s/$/#/p' sed.txt  
1  1#
2#
3#
4#
5#
10#
20#
30#
40#
50#
#woood ##
#woooooood ##
#wood#

◆sed插入与增加

 H表示剪切,G表示粘贴
#将所有含有数字的行 替换成A
[root@localhost opt]# sed '/[0-9]/c A' sed.txt  
A
A
.....
A
#woood #
#woooooood #
#wood
#将2替换成B  
[root@localhost opt]# sed 'y/2/B/' sed.txt  
1  1
B
3
4
5
10
B0
.....
#wood
#在最后一行增加AAAAAAAA
[root@localhost opt]# sed '$a AAAAAAAAA' sed.txt 
1  1
2
3
.....
#wood
AAAAAAAAA
#在第五行下面增加AAAAAAAAAA
[root@localhost opt]# sed '5a AAAAAAAAA' sed.txt  
1  1
2
3
4
5
AAAAAAAAA
10
20
30
.....
#去1-3行每一行下面增加AAAAAAAAA
[root@localhost opt]# sed '1,3a AAAAAAAAA' sed.txt  
1  1
AAAAAAAAA
2
AAAAAAAAA
3
AAAAAAAAA
4
5
.....
#去第一行上面增加BBBB
[root@localhost opt]# sed '1i BBBB' sed.txt 
BBBB
1  1
2
3
..........
#去第2行下面插入/etc/resolv.conf文件中的所有内容
[root@localhost opt]# sed '2r /etc/resolv.conf' sed.txt  
1  1
2
# Generated by NetworkManager
nameserver 8.8.8.8
3
4
...............
#将/etc/passwd中包含root的行剪切到最后一行
[root@localhost opt]# sed '/root/{H;d};$G' /etc/passwd

猜你喜欢

转载自blog.csdn.net/weixin_48190891/article/details/108283376