shell——文本三剑客之sed命令

目录

一.sed命令

1.sed功能

2.命令格式

3.常用选项

4.常用操作 

二.sed命令的使用

1.打印内容

2.打印行号和文本

3.使用地址

1.查看任意文本行

2.查看奇偶数行 

3.查看一段时间内的文本内容

4.删除行

5.替换

6.插入


一.sed命令

1.sed功能

sed是行编辑器

Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(PatternSpace) ,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。一次处理一行的设计模式使得sed性能很高 , sed在读取大文件时不会出现卡顿的现象。如果使用vi命令打开几十M上百M的文件,明显会出现有卡顿的现象,这是因为vi命令打开文件是一-次性将文件加载到内存,然后再打开。Sed就避免了这种情况,一行一行的处理,打开速度非常快,执行速度也很快 

2.命令格式

格式一:
sed [选项] '操作' 文件1  文件2...

格式二:
sed [选项] '选项{
操作1
操作2
...
}' 文件1  文件2...

3.常用选项

命令 作用
-e 或–expression= 表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用
-f 或–file= 表示用指定的脚本文件来处理输入的文本文件。
-h 或–help 显示帮助。
-n、–quiet 或 silent 禁止sed编辑器输出,但可以与p命令一起使用完成输出
-i 直接修改目标文本文件。

4.常用操作 

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

二.sed命令的使用

1.打印内容

[root@oyyy ~]# sed ' ' /etc/fstab       打印/etc/fstab文件的内容

[root@oyyy ~]# sed -n 'p' /etc/fstab  打印/etc/fstab文件的内容

 [root@oyyy ~]# sed -n '=' /etc/fstab 

[root@oyyy ~]# sed -n 'l' /etc/fstab  打印不显示的ASCII字符

2.打印行号和文本

①[root@oyyy ~]# sed -n '=;p' /etc/fstab 

②[root@oyyy ~]# sed -n -e '=' -e 'p' /etc/fstab 

③[root@oyyy ~]# sed -n '
> =
> p
> ' /etc/fstab

3.使用地址

1.查看任意文本行

打印第一行
sed -n '1p' 文件

打印最后一行
sed -n '$p' 文件

打印1到3行
sed -n '1,3p' 文件

打印1到后面3行
sed -n '1,+3p' 文件 (即打印四行)

2.查看奇偶数行 

[root@oyyy ~]# sed -n 'p;n' /etc/fstab    打印奇数行;n表示移动到下一行

[root@oyyy ~]# sed -n 'n;p' /etc/fstab    打印偶数行

[root@oyyy ~]# sed -n '1~2p' /etc/fstab 

[root@oyyy ~]# sed -n '2~2p' /etc/fstab 

3.查看一段时间内的文本内容

4.删除行

[root@oyyy ~]# cat 1.txt |sed '1~2d'  删除奇数行内容

[root@oyyy ~]# cat 1.txt |sed '2~2d'  删除偶数行内容

 [root@oyyy ~]# sed -i '2d' 1.txt 删除第二行内容

 [root@oyyy ~]# sed -i '2a\\n ooo' 1.txt 

修改文件内部需要多加一个\

 [root@oyyy ~]# seq 10 |sed '2a\hehe\nooo'

[root@oyyy ~]# seq 10 |sed -n '2!p'

5.替换

行范围 s/旧字符串/新字符串/替换标记

标记 作用
数字 标明新字符串将替换第几处匹配的地方
g 表明新字符串将会替换所有匹配的地方
p 打印与替换命令匹配的行,与-n一起使用
w 文件 将替换的结果写到文件中
sed -n 's/root/admin/p' /etc/passwd            将/etc/passwd文件中的root替换成admin并打印替换后的内容,同行出现多个root时只替换第一个
sed -n 's/root/admin/2p' /etc/passwd        将/etc/passwd文件中同一行中的第二个root替换成admin并打印替换后的整行内容
sed -n 's/root/admin/gp' /etc/passwd        将/etc/passwd文件中的root全部替换成admin并打印替换后的内容

[root@oyyy ~]# sed -n 's/root/admin/p' /etc/passwd

[root@oyyy ~]# sed -n 's/root/admin/2p' /etc/passwd

[root@oyyy ~]# sed -n 's/root/admin/gp' /etc/passwd

[root@oyyy ~]# sed '1,20 s/^/#/' /etc/passwd 

 root@oyyy ~]# sed '/^root/ s/$/#/' /etc/passwd

 [root@oyyy ~]# sed '1,20w ooo.txt' /etc/passwd

6.插入

[root@oyyy ~]# echo 123abcxxx |sed -r 's/(123)(abc)(xxx)/\1\3/'

[root@oyyy ~]# echo 123abcxxx |sed -r 's/(123)(abc)(xxx)/\1/'

截取IP地址

[root@oyyy ~]# ifconfig ens33 |sed -nr '2s/.*inet ([0-9.]+) .*/\1/p'

[root@oyyy ~]# echo /etc/sysconfig/network-scripts/ifcfg-ens33 |sed -nr 's@^(.*)/([^\]+)@\1@p'
 [root@oyyy ~]# echo /etc/sysconfig/network-scripts/ifcfg-ens33 |sed -nr 's@^(.*)/([^\]+)@\2@p'

猜你喜欢

转载自blog.csdn.net/oyyy3/article/details/120976463