什么是sed?
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓存区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使用诸如'D'的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
参考网址:http://www.gnu.org/software/sed/manual/sed.html
sed [OPTION] ‘Script’ inputfile
OPTION | 用途 |
---|
-n | 不输出模式空间的内容到屏幕,即关闭自动打印 |
-e | 多点编辑,即执行多条命令 |
-f /PATH/SCRIPT_FILE | 从指定的文件中读取编辑脚本 |
-r | 使用正则表达式 |
-i.bak | 单独-i是编辑修改文件内容,-i.bak修改文件前进行备份 |
‘script’——‘地址命令’
符号 | 用途 |
---|
‘NUM’ | 指定NUM行 |
‘$’ | 最后一行 |
‘/PATTERN/’ | 被匹配到的每一行 |
‘NUM,NUM’ | 范围的行,即多少行到多少行 |
‘NUM1,+NUM’ | 范围行,即从NUM1行往后+NUM行 |
‘PATTERN’,‘PATTERN’ | 被匹配到的范围的行,即匹配到数据到匹配到另一个数据之间的行 |
‘NUM,/PATTERN/’ | 从第NUM行到被匹配到数据的范围的行 |
‘1~2’ | 步进,12奇数行 |
‘2~2’ | 步进,22偶数行 |
‘script’——‘编辑命令’
符号 | 用途 |
---|
d | 删除模式空间匹配的行,并立即启用下一轮循环 |
p | 打印当前模式空间内容,追加到默认输出之后 |
a[\]text | 在指定行后面追加文本,支持使用\n实现多行追加(追加多行在每行后面加换行符\n即可) |
i[\]text | 在指定行前面插入文本,支持使用\n实现多行追加(追加多行在每行后面加换行符\n即可), |
c[\]text | 替换行为单位或多行文本 |
w /PATH/FILE | 保存模式匹配的行至指定文件(将匹配到的行的数据另存文件) |
r /PATH/FILE | 读取指定文件的文本至模式空间中匹配的行后(把指定文本的数据读取到匹配行的后面) |
= | 为模式空间中的行打印行号 |
! | 对模式空间中匹配到的行进行取反(除了匹配到的行以外其他的行) |
‘script’——‘搜索替换’
符号 | 用途 |
---|
‘s/匹配文本/替换文本/标记’ | 查找替换也可以使用s@@@或者s### |
‘s/匹配文本/替换文本/g’ | 全部替换 |
‘s/匹配文本/替换文本/p’ | 显示替换成功的行 |
‘s/匹配文本/替换文本/w FILE’ | 替换成功的行保存到文件 |
范例
[root@localhost ~]#seq 10 | sed '2~2d;1d'
3
5
7
9
[root@localhost ~]#seq 10 | sed '2~2a\ 7788'
1
2
7788
3
4
7788
5
6
7788
7
8
7788
9
10
7788
`1. 添加文本到文件`
[root@localhost ~]#sed '/# User specific/ialias' .bashrc
# .bashrc
alias---------------`添加的文件`
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
`2. 搜索替换`
[root@localhost ~]#sed -n 's/\(UUID\)/Error/p' /etc/fstab
Error=4c01a418-3b33-4271-9a19-0ff2895e7654 / xfs defaults 0 0
Error=219c85c0-a0ef-4ee3-9613-3da9cda5e048 /boot xfs defaults 0 0
Error=ae1302a1-04bb-447f-99ad-f7f84a16b06d /data xfs defaults 0 0
Error=5da7cfd1-2490-4dfc-a0bb-5e7135a16f7c swap swap defaults 0 0
`3. -r`
[root@localhost ~]#grep 'root' /etc/passwd | sed -r 's/(root)/\1er/g'
rooter:x:0:0:rooter:/rooter:/bin/bash
operator:x:11:0:operator:/rooter:/sbin/nologin
`4. ifconfig拿出IP`
[root@localhost ~]#ifconfig ens33 | sed -nr '2s/^[^0-9]+([0-9.]+) .*/\1/p'
192.168.88.131
`修改网卡名eth0`
[root@localhost ~]#sed -ri.bak 's/(linux16.*)/\1 net.ifnames=0/' /boot/grub2/grub.cfg /boot/grub2/grub.cfg
‘script’——‘通往月薪20K道路之一之高级编辑命令’
符号 | 用途 |
---|
P | 打印到输出之前 |
h | 把模式空间的内容放到保持空间 |
H | 把模式空间内容追加到保持空间 |
g | 把保持空间内容覆盖到模式空间 |
G | 把保持空间内容追加到模式空间 |
x | 模式空间与保持空间的内容进行互换 |
n | 匹配的下一行覆盖到模式空间 |
N | 匹配的下一行追加到模式空间 |
d | 删除模式空间的行 |
D | 如果模式空间有换行符,不读取新行,重新使用模式空间 |
sed高级命令示例
#sed -n 'n;p' FILE
[root@localhost /data/script]#sed -n 'n;p' f1
2
4
6
8
10
#sed '1!G;h;$!d' FILE
[root@localhost /data/script]#sed '1!G;h;$!d' f1
10
9
8
7
6
5
4
3
2
1
#sed 'N;D'FILE
[root@localhost /data/script]#sed 'N;D' f1
10
#sed '$!N;$!D' FILE
[root@localhost /data/script]#sed '$!N;$!D' f1
9
10
#sed '$!d' FILE
[root@localhost /data/script]# sed '$!d' f1
10
#sed 'G' FILE
[root@localhost /data/script]#sed 'G' f1
1
2
3
4
5
6
7
8
9
10
#sed 'g' FILE
[root@localhost /data/script]#sed 'g' f1
#sed '/^$/d;G' FILE
[root@localhost /data/script]#sed '/^$/d;G' f1
1
2
3
4
5
6
7
8
9
10
#sed 'n;d' FILE
[root@localhost /data/script]#sed 'n;d' f1
1
3
5
7
9
#sed -n '1!G;h;$p' FILE
[root@localhost /data/script]#sed -n '1!G;h;$p' f1
10
9
8
7
6
5
4
3
2
1
课后练习
1、删除centos7系统/etc/grub2.cfg文件中所有以空白开头的行行首的空白字符
[root@localhost /data/script]#sed -nr 's/^[[:blank:]]+//pg' ./grub2.cfg
2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符[root@localhost /data/script]#sed -nr 's/^#[[:blank:]]+//pg' ./grub2.cfg
3、在centos6系统/root/install.log每一行行首增加#号
[root@localhost /data/script]#sed -nr 's/^[[:blank:]]+//pg' ./grub2.cfg
长度/
4、在/etc/fstab文件中不以#开头的行的行首增加#号
[root@localhost /etc]# sed -r 's@^[^#]@#&@p' /etc/fstab
5、处理/etc/fstab路径,使用sed命令取出其目录名和基名
目录:[root@localhost /etc]#echo "/etc/fstab"|sed -r 's#^(.*/)([^/]+/?)#\1#'
基名:[root@localhost /etc]#echo "/etc/fstab"|sed -r 's#^(.*/)([^/]+/?)#\2#'
6、利用sed 取出ifconfig命令中本机的IPv4地址
[root@localhost /etc]#ifconfig |sed -n '/broadcast/'p|sed -r 's/.*inet\ (.*)\ netmask.*/\1/'
7、统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数
1.[root@localhost ~]#ls *.rpm|sed -r 's#^.*\.([^.]+)\.rpm$#\1#'|sort|uniq -c
2.[root@localhost ~]#ls *.rpm|sed -r 's#^.*\.([^.]+)\.rpm$#\1#'|sort|uniq -c
8、统计/etc/init.d/functions文件中每个单词的出现次数,并排序(用grep和sed两种方法分别实现)
1.[root@magedu ~]# egrep -o "[[:alpha:]]+" /etc/init.d/functions| sort | uniq -c | sort -nr
2.[root@magedu ~]# sed -r "s/[^[:alpha:]]/\n/g" /etc/init.d/functions| sort | uniq -c | sort
-nr
9、将文本文件的n和n+1行合并为一行,n为奇数行