Linux三剑客之Sed命令

一、sed 简介

1、sed英文全称是stream editor,流编辑器,功能十分强大,由贝尔实验室的Lee E.McMahon 在1973年到1974年之间开发完成,目前可以在大多数操作系统中使用,sed的出现作为grep的继任者。与vim等编辑器不同的是,sed是一种非交互式的编辑器,它使用预先设定好的编辑指令对输入的文本进行编辑,完成之后再输出编辑结构。配合正则表达式用可以实现很多文本处理操作。

2、Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。经常用于在对文件中符合要求文本进行免交互的操作,如打印、删除、字符串替换、配置文件选项的批量自动修改等。

二、sed工作原理

1、sed会一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。还有一个空间叫做保持空间,又称暂存空间,可以暂时存放一些处理的数据,但不能直接输出,它只能放到模式空间输出,这两个空间其实就是在内存中初始化的一个内存区域,存放正在处理的数据和临时存放的数据。

2、和grep一样,sed是一行一行的处理的。sed处理文本时,首先会将源文件复制一份到内存中,然后将文本一行一行拿到模式空间内进行操作,最后输出到标准输出,即屏幕上。

3、在模式空间中,每一行都会根据用户给的条件进行匹配,匹配到了进行编辑后输出,没有匹配到,直接输出到标准输出。sed除了模式空间还有一个保持空间,能够让行在模式空间和保持空间多次进行处理,进而完成复杂的处理工作。

三、环境准备
准备一台Centos6服务器
系统: Centos6.5
内存:1G
cpu: 2核
IP地址: 10.0.0.53
[root@localhost ~]# cat /etc/redhat-release 
CentOS release 6.5 (Final)
[root@localhost ~]# 
四、Sed语法
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...
1、处理单个文件的命令格式
sed     [options]   '[匹配模式]     sed 的内部命令'   file1
2、处理多个文件的命令格式
sed     [options]   '[匹配模式]     [sed 的内部命令]'    file1  file2
五、Sed参数

-e:承接多个筛选条件

-f:后跟保存了sed指令的文件。

-h:或–help 显示帮助。

-n:或–quiet或–silent 仅显示script处理后的结果。

-V:或–version 显示版本信息。

-i: inplace,就地编辑

-r: 支持扩展元字符

a:追加 追加内容(匹配行后)

c:更改 更改匹配行的内容

i:插入 插入内容(匹配行前)

d:删除 删除匹配的内容

s:替换 替换掉匹配的内容

p:打印 打印出匹配的内容,通常与-n选项和用

||

h:把模式空间里的内容复制到暂存缓冲区

H:把模式空间里的内容追加到暂存缓冲区

g:把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容

G:把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面

l:列出非打印字符

n:读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理

!:对所选行以外的所有行应用命令

s:用一个字符串替换另一个

g:在行内进行全局替换

x:交换暂存缓冲区与模式空间的内容

y:将字符替换为另一字符(不能对正则表达式使用y命令)

r,w:读和写编辑命令,r用于将内容读入文件,w用于将匹配内容写入到文件

q:找到第一个匹配就退出

y:变换字符(一 一对应)

六、sed工具使用
安装阿帕奇服务
yum -y install httpd
# 根据行号替换网站根目录
sed -i '119s/html/szm/' httpd.conf 

在这里插入图片描述

# 找到这个目录并打印出来
sed -n '/^DocumentRoot/p' httpd.conf 
# 替换网站根目录
sed -i '/^DocumentRoot/s/szm/wg/' httpd.conf

在这里插入图片描述

# 结合正则表达式替换的是整个根目录,反斜杠是防转义
sed -i '/^DocumentRoot/s/\/var\/www\/wg/\/opt\/html/' httpd.conf 

在这里插入图片描述

# 编辑文件
vim 1.txt 
# 添加如下
ab
abc
adc
aaa
cad
[root@localhost ~]# sed -n '2,4s/a/1/p' 1.txt 
1bc
1dc
1aa
# 把第二行到第四行的a替换为1
[root@localhost ~]# sed -i '2,4s/a/1/' 1.txt 
[root@localhost ~]# cat 1.txt 
ab
1bc
1dc
1aa
cad
[root@localhost ~]# 
[root@localhost ~]# sed -i '2,4s/1/a/' 1.txt 
# 把第二行到第四行的a替换为1,g是全局
[root@localhost ~]# sed -i '2,4s/a/1/g' 1.txt 
[root@localhost ~]# cat 1.txt 
ab
1bc
1dc
111
cad
[root@localhost ~]# 
# 在文件的最后一行添加内容为123456,a是追加,$是匹配最后一行
[root@localhost ~]# sed -i '$a123456' 1.txt 
[root@localhost ~]# cat 1.txt 
ab
1bc
1dc
111
cad
123456
[root@localhost ~]# 
# 在文件的第一行添加内容为123456,i是插入,1是行号
[root@localhost ~]# sed -i '1i123456' 1.txt 
[root@localhost ~]# cat 1.txt 
123456
ab
1bc
1dc
111
cad
123456
[root@localhost ~]# 
[root@localhost ~]# cat 1.txt 
123456
ab
1bc
1dc
111
cad
123456
# 删除第一行内容
[root@localhost ~]# sed -i '1d' 1.txt 
[root@localhost ~]# cat 1.txt 
ab
1bc
1dc
111
cad
123456
[root@localhost ~]# 
[root@localhost ~]# cat 1.txt 
ab
1bc
1dc
111
cad
123456
# 在1-3行后追加内容为ABC
[root@localhost ~]# sed -i '1,3aABC' 1.txt 
[root@localhost ~]# cat 1.txt 
ab
ABC
1bc
ABC
1dc
ABC
111
cad
123456
[root@localhost ~]# 
[root@localhost ~]# cat 1.txt 
ab
ABC
1bc
ABC
1dc
ABC
111
cad
123456
# 删除包含内容为ABC的行
[root@localhost ~]# sed -i '/ABC/d' 1.txt 
[root@localhost ~]# cat 1.txt 
ab
1bc
1dc
111
cad
123456
[root@localhost ~]# 
# 安装阿帕奇服务
yum -y install httpd
# 拷贝阿帕奇配置文件至当前路径下
cp /etc/httpd/conf/httpd.conf ./
# 将注释行和空行删除 
sed -i -e '/^#/d' -e '/^$/d' httpd.conf 
# 拷贝系统用户信息文件至当前路径下
cp /etc/passwd ./
# 在行首为root的行后面换行追加hello 
[root@localhost ~]# sed '/^root/a\hello' /etc/passwd
root:x:0:0:root:/root:/bin/bash
hello
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
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
saslauth:x:498:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
[root@localhost ~]# 
# &代表正则表达式匹配到的值
[root@localhost ~]# sed -e  's/^root/a&a/' passwd    
aroota: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
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
saslauth:x:498:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
[root@localhost ~]# 
# 全局替换
sed -e  's/root/a&a/g' passwd    

在这里插入图片描述

# 修改阿帕奇端口为8000
sed -i 's/Listen 80/Listen 8000/' httpd.conf 

在这里插入图片描述

# 修改阿帕奇的网站根目录
sed -i 's/DocumentRoot "\/var\/www\/html"/DocumentRoot "\/html"/' httpd.conf 

在这里插入图片描述

# 修改阿帕奇首页
sed -i 's/index.html/index.php/' httpd.conf 

在这里插入图片描述

# 修改阿帕奇端口为8000,Centos7上敲这个
 sed -i -e '/^Listen/d' -e '136iListen 8000' httpd.conf
发布了68 篇原创文章 · 获赞 24 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/aaronszm/article/details/103825365