赞
踩
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服务的端口
测试
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。