sed
一,sed概述
sed行编辑器
stream editor
用来操作纯 ASCII 码的文本
处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),可以指定仅仅处理哪些行
sed处理完成之后把缓冲区的内容送往屏幕,接着处理下一行,这样不断重复, 直到文件末尾
sed符合条件的处理,不符合条件的不予处理,文件内容并没有 改变,除非用重定向存储输出
二,调用 sed 命令有两种形式:
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
三,多种操作模式
p 显示 d 删除 a 添加 c 替换 w 写入 i 插入
1,p 模式操作
-n 只列出结果sed特殊处理的那一行,不显示原来那一行
-e 多重编辑
sed -n '/^#/p' fstab 表示显示以#开头的行
sed -n '/^#/!p' fstab 表示以#开头的行不显示
sed -n '/0$/!p' fstab 表示以0结尾的行不显示
sed -n '/0$/p' fstab 表示显示以0结尾结尾的行
sed -n -e '2!p' fstab 表示第二行不显示
sed -n -e '2,5!p' fstab 表示第2到5行不现实
sed -n -e '2!p;6!p' | uniq -d fstab 表示第2,6行不显示
sed -n -e '2!p;6!p' uniq -u fstab 表示只显示第2,6行
练习
给定userfile和passfile,批量创建用户
2,d模式
sed -e '2d;6d' fstab 表示第2行,第6行删除
sed -e '2,6d' fstab 表示第2到6行删除
sed -e '/^#/d' fstab 表示删除以#开头的行
sed -e '/^$/d;/^#/d' fstab 表示删除空行并且以#开头的行 ^$表示首尾相连,也就是空行
sed -e '/UUID/d' fstab 表示删除含有UUID的行
sed -e '/UUID/!d' fstab 表示不删除含有UUID的行,也就是只显示含有UUID的行
4,a模式
sed '/hello/aword' westos 表示把word加在含有hello后一行 默认是在后面一行追加
sed 's/hello/hello world/g' westos 表示把含有hello的行替换为hello world ,这里g是全文替换,注意前面有s
sed '/hello/aworld westos' westos 表示在含有hello后面一行追加world westos,其中world westos在一行
sed '/hello/aworld\nwestos' westos 表示在含有hello 后面一行追加 world westos,但是有\n表示换行
5,i模式
sed '/hello/iworld\nwestos' westos 表示在含有hello行的前面插入world westos,\n表示换行
6,c模式
sed '/hello/chello world' westos 表示把含有hello的行替换为hello
sed '/hello/cwestos\nworld' westos 表示把含有hello的行替换为westos world,\n表示换行
7,w模式
前面的模式默认是不会改变文件的内容的
sed -n '/bash$/p' passwd > file 重定向写入文件
sed -n '/bash$/wfile' passwd 在w模式下,可以直接写入文件,这是追加的过程,不会覆盖原文
四,sed其他常用命令
sed命令
a\\ 在当前行下面插入文本。
i\\ 在当前行上面插入文本。
c\\ 把选定的行改为新的文本。
d 删除,删除选择的行。
D 删除模板块的第一行。
s 替换指定字符
h 拷贝模板块的内容到内存中的缓冲区。
H 追加模板块的内容到内存中的缓冲区。
g 获得内存缓冲区的内容,并替代当前模板块中的文本。
G 获得内存缓冲区的内容,并追加到当前模板块文本的后面。
l 列表不能打印字符的清单。
n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
p 打印模板块的行。
P(大写) 打印模板块的第一行。
q 退出Sed。
b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
r file 从file中读行。
t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
w file 写并追加模板块到file末尾。
W file 写并追加模板块的第一行到file末尾。
! 表示后面的命令对所有没有被选定的行发生作用。
= 打印当前行号码。
# 把注释扩展到下一个换行符以前。
sed替换标记
g 表示行内全面替换。
p 表示打印行。
w 表示把行写入一个文件。
x 表示互换模板块中的文本和缓冲区中的文本。
y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
\\1 子串匹配标记
& 已匹配字符串标记
[root@100 mnt]# cat westos
hello
[root@100 mnt]# sed '/hello/=' westos 显示包含hello的行并且输出行号
1
hello
[root@100 mnt]# sed -n '/hello/=' westos 只显示包含hello的行号
[root@100 mnt]# cat westos
hello
[root@100 mnt]# sed '/hello/=' -i westos -i表示插入文本,插入位置在包行hello的行的上面一行
[root@100 mnt]# cat westos
1
hello
[root@100 mnt]# cat westos
hello
[root@100 mnt]# sed '/hello/=' westos
1
hello
[root@100 mnt]# echo `sed '/hello/=' westos` echo 把原来两行的变成了一行的内容
1 hello
[root@100 mnt]# cat westos
hello
world
[root@100 mnt]# sed '=' westos 打印每一行的行号,并且显示在该行的上面
1
hello
2
world
[root@100 mnt]# echo `sed '=' westos` 多行变一行
1 hello 2 world
[root@100 mnt]# cat westos
##############################################
[root@100 mnt]# sed '2r westos' fstab 表示把westos中的内容写在fstab的第2行之后
#
##############################################
# /etc/fstab
# Created by anaconda on Wed May 7 01:22:57 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
[root@100 mnt]# sed '$r westos' fstab 表示把westos中的内容写在fstab的尾行之后
#
# /etc/fstab
# Created by anaconda on Wed May 7 01:22:57 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
##############################################
[root@100 mnt]# sed -n '/^UUID/=' fstab 不显示原来内容,把以UUID开头的行号显示出来
9
[root@100 mnt]# sed '/^UUID/=' fstab 显示原来内容,把以UUID开头的行号显示出来,默认行号在搜索内容的上一行显示
#
# /etc/fstab
# Created by anaconda on Wed May 7 01:22:57 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
9
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
[root@100 mnt]# sed -n -e '/^UUID/p' fstab
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
[root@100 mnt]# sed -n -e '/^UUID/p' -n -e '/^UUID/=' fstab 既显示搜索行,也显示行号 -e 表示扩展
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
9
[root@100 mnt]# sed -n -e '/^UUID/p;/^UUID/=' fstab 可以合并
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
9
[root@100 mnt]# sed '=' fstab 在所有行的前面一行添加行号
1
2
#
3
# /etc/fstab
4
# Created by anaconda on Wed May 7 01:22:57 2014
5
#
6
# Accessible filesystems, by reference, are maintained under '/dev/disk'
7
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
8
#
9
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
10
/dev/sda /iscsidisk xfs defaults,_netdev 0 0
[root@100 mnt]# sed '=' fstab | sed 'N;s/\n//g' 给每一行行首添加行号 s表示替换
1
2#
3# /etc/fstab
4# Created by anaconda on Wed May 7 01:22:57 2014
5#
6# Accessible filesystems, by reference, are maintained under '/dev/disk'
7# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
8#
9UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
10/dev/sda /iscsidisk xfs defaults,_netdev 0 0
[root@100 mnt]# sed '=' fstab | sed 'N;s/\n/ /g' 给每一行行首添加行号和空格
1
2 #
3 # /etc/fstab
4 # Created by anaconda on Wed May 7 01:22:57 2014
5 #
6 # Accessible filesystems, by reference, are maintained under '/dev/disk'
7 # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
8 #
9 UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
10 /dev/sda /iscsidisk xfs defaults,_netdev 0 0
[root@100 mnt]# cat fstab
# Created by anaconda on Wed May 7 01:22:57 2014
# Accessible filesystems, by reference, are maintained under '/dev/disk'
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
/dev/sda /iscsidisk xfs defaults,_netdev 0 0
[root@100 mnt]# sed 'G' fstab 每一行后面添加空行
# Created by anaconda on Wed May 7 01:22:57 2014
# Accessible filesystems, by reference, are maintained under '/dev/disk'
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
/dev/sda /iscsidisk xfs defaults,_netdev 0 0
[root@100 mnt]# sed '$!G' fstab 除了最后一行外,每一行后面添加空行
# Created by anaconda on Wed May 7 01:22:57 2014
# Accessible filesystems, by reference, are maintained under '/dev/disk'
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
/dev/sda /iscsidisk xfs defaults,_netdev 0 0
[root@100 mnt]# cat fstab
# Created by anaconda on Wed May 7 01:22:57 2014
# Accessible filesystems, by reference, are maintained under '/dev/disk'
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
/dev/sda /iscsidisk xfs defaults,_netdev 0 0
[root@100 mnt]# sed -n '2p' fstab 打印第2行的内容
# Accessible filesystems, by reference, are maintained under '/dev/disk'
[root@100 mnt]# sed -n '$p' fstab 打印最后一行的内容
/dev/sda /iscsidisk xfs defaults,_netdev 0 0
全文替换命令
注意:sed的c模式也可以进行替换,c模式的替换是对关键字的整行进行替换,但是s参数是只对关键字进行替换
[root@147 mnt]# cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
gnome-initial-setup:x:993:991::/run/gnome-initial-setup/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
p:x:1001:1001::/home/p:/bin/bash
user1:x:1002:1002::/home/user1:/bin/bash
user2:x:1003:1003::/home/user2:/bin/bash
user3:x:1004:1004::/home/user3:/bin/bash
[root@147 mnt]# sed 's/nologin/westos/g' passwd >>>>>s表示替换,g表示全文的 把nologin全文替换为westos
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/westos
daemon:x:2:2:daemon:/sbin:/sbin/westos
adm:x:3:4:adm:/var/adm:/sbin/westos
lp:x:4:7:lp:/var/spool/lpd:/sbin/westos
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/westos
operator:x:11:0:operator:/root:/sbin/westos
games:x:12:100:games:/usr/games:/sbin/westos
ftp:x:14:50:FTP User:/var/ftp:/sbin/westos
nobody:x:99:99:Nobody:/:/sbin/westos
gnome-initial-setup:x:993:991::/run/gnome-initial-setup/:/sbin/westos
tcpdump:x:72:72::/:/sbin/westos
p:x:1001:1001::/home/p:/bin/bash
user1:x:1002:1002::/home/user1:/bin/bash
user2:x:1003:1003::/home/user2:/bin/bash
user3:x:1004:1004::/home/user3:/bin/bash
[root@147 mnt]# sed '3,5s/nologin/westos/g' passwd >>>>>>全文替换替换3到5行的nologin为westos
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/westos
adm:x:3:4:adm:/var/adm:/sbin/westos
lp:x:4:7:lp:/var/spool/lpd:/sbin/westos
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
gnome-initial-setup:x:993:991::/run/gnome-initial-setup/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
p:x:1001:1001::/home/p:/bin/bash
user1:x:1002:1002::/home/user1:/bin/bash
user2:x:1003:1003::/home/user2:/bin/bash
user3:x:1004:1004::/home/user3:/bin/bash
[root@147 mnt]# sed -e '/adm/,/sync/s/nologin/westos/g' passwd >>>>>从包含adm到包行sync的行里面,全文替换nologin为westos
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/westos
lp:x:4:7:lp:/var/spool/lpd:/sbin/westos
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
gnome-initial-setup:x:993:991::/run/gnome-initial-setup/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
p:x:1001:1001::/home/p:/bin/bash
user1:x:1002:1002::/home/user1:/bin/bash
user2:x:1003:1003::/home/user2:/bin/bash
user3:x:1004:1004::/home/user3:/bin/bash
[root@147 mnt]# sed -e '/adm/,/sync/s/nologin/westos/g;s/sbin/lee/g' passwd >>>>从包含adm到包行sync的行里面,全文替换nologin为westos,全文替换sbin为lee ;表示衔接多个操作
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/lee/nologin
daemon:x:2:2:daemon:/lee:/lee/nologin
adm:x:3:4:adm:/var/adm:/lee/westos
lp:x:4:7:lp:/var/spool/lpd:/lee/westos
sync:x:5:0:sync:/lee:/bin/sync
shutdown:x:6:0:shutdown:/lee:/lee/shutdown
halt:x:7:0:halt:/lee:/lee/halt
mail:x:8:12:mail:/var/spool/mail:/lee/nologin
operator:x:11:0:operator:/root:/lee/nologin
games:x:12:100:games:/usr/games:/lee/nologin
ftp:x:14:50:FTP User:/var/ftp:/lee/nologin
nobody:x:99:99:Nobody:/:/lee/nologin
gnome-initial-setup:x:993:991::/run/gnome-initial-setup/:/lee/nologin
tcpdump:x:72:72::/:/lee/nologin
p:x:1001:1001::/home/p:/bin/bash
user1:x:1002:1002::/home/user1:/bin/bash
user2:x:1003:1003::/home/user2:/bin/bash
user3:x:1004:1004::/home/user3:/bin/bash
[root@147 mnt]# vim file
[root@147 mnt]# cat file >>>>>把命令写在文件里面
s/sbin/westos/g
s/nologin/linux/g
[root@147 mnt]# sed -f file passwd >>>>>-f后面指定命令文件
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/westos/linux
daemon:x:2:2:daemon:/westos:/westos/linux
adm:x:3:4:adm:/var/adm:/westos/linux
lp:x:4:7:lp:/var/spool/lpd:/westos/linux
sync:x:5:0:sync:/westos:/bin/sync
shutdown:x:6:0:shutdown:/westos:/westos/shutdown
halt:x:7:0:halt:/westos:/westos/halt
mail:x:8:12:mail:/var/spool/mail:/westos/linux
operator:x:11:0:operator:/root:/westos/linux
games:x:12:100:games:/usr/games:/westos/linux
ftp:x:14:50:FTP User:/var/ftp:/westos/linux
nobody:x:99:99:Nobody:/:/westos/linux
gnome-initial-setup:x:993:991::/run/gnome-initial-setup/:/westos/linux
tcpdump:x:72:72::/:/westos/linux
p:x:1001:1001::/home/p:/bin/bash
user1:x:1002:1002::/home/user1:/bin/bash
user2:x:1003:1003::/home/user2:/bin/bash
user3:x:1004:1004::/home/user3:/bin/bash
[root@147 mnt]# cat passwd >>>>>注意sed的操作是不会改变源文件的内容的
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
gnome-initial-setup:x:993:991::/run/gnome-initial-setup/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
p:x:1001:1001::/home/p:/bin/bash
user1:x:1002:1002::/home/user1:/bin/bash
user2:x:1003:1003::/home/user2:/bin/bash
user3:x:1004:1004::/home/user3:/bin/bash
[root@147 mnt]# sed -f file -i passwd >>>>>-i输入到passwd文件,保存起来
[root@147 mnt]# cat passwd >>>>>此时查看源文件也被修改了
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/westos/linux
daemon:x:2:2:daemon:/westos:/westos/linux
adm:x:3:4:adm:/var/adm:/westos/linux
lp:x:4:7:lp:/var/spool/lpd:/westos/linux
sync:x:5:0:sync:/westos:/bin/sync
shutdown:x:6:0:shutdown:/westos:/westos/shutdown
halt:x:7:0:halt:/westos:/westos/halt
mail:x:8:12:mail:/var/spool/mail:/westos/linux
operator:x:11:0:operator:/root:/westos/linux
games:x:12:100:games:/usr/games:/westos/linux
ftp:x:14:50:FTP User:/var/ftp:/westos/linux
nobody:x:99:99:Nobody:/:/westos/linux
gnome-initial-setup:x:993:991::/run/gnome-initial-setup/:/westos/linux
tcpdump:x:72:72::/:/westos/linux
p:x:1001:1001::/home/p:/bin/bash
user1:x:1002:1002::/home/user1:/bin/bash
user2:x:1003:1003::/home/user2:/bin/bash
user3:x:1004:1004::/home/user3:/bin/bash
五,shell脚本练习
编写脚本,安装httpd服务,修改httpd服务的端口
测试