sed行文本处理工具入门教程

工作原理:

简单的来说,Sed一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称之为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕,接着处理下一行,直到文件末尾。

语法:

sed [option] [script'(sed自带语法脚本)] [input-file处理的文件]

sed [选项] + "地址+命令 " file

常用option参数(+描述):

Script:

    地址+命令

           地址:

               1.不给地址:对全文进行处理;

               2.单地址:

                    #:指定的行(1p,2p...);

                    /pattern/:被模式匹配匹配到的字串行;

               3.范围地址:

                    #,#:第几行只第几行(1,2p);

                    #,+#:从第#行起始向后+#行;

                    /pat1/,/pat2/:模式1匹配 所在行至模式2匹配所在行;

                    #,/pat/:第几行只模式匹配行;

                4.~:步进

                    1~2:奇数行

                    2~2:偶数行

编辑命令:

 sed查找替换:

  s///:查找替换(分隔符):

    s@@@

    s###

替换标记:

  g:行内全局替换;

  p:显示替换成功的行;

  w /PATH/TO/Somefile:将替换成功的行报错至文件中;

操作原文件:

 

[root@linuxidc ~]# cat -n Test.txt

1 root:x:0:0:root:/root:/bin/bash

2 bin:x:1:1:bin:/bin:/sbin/nologin

3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

4 adm:x:3:4:adm:/var/adm:/sbin/nologin

5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

6 sync:x:5:0:sync:/sbin:/bin/sync

7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

8 halt:x:7:0:halt:/sbin:/sbin/halt

9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

10 operator:x:11:0:operator:/root:/sbin/nologin

匹配打印(p):

 

#打印匹配root开头的行:

#每一行都读到模式空间,不加-n参数默认进行输出,这里看到root:x:0:0:root:/root:/bin/bash输出两行

[root@linuxidc ~]# cat Test.txt | sed '/^root/p'

root:x:0:0:root:/root:/bin/bash

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

[root@linuxidc ~]# tail Test.txt | sed -n '/^root/p'

root:x:0:0:root:/root:/bin/bash

#打印包含root的行:

[root@linuxidc ~]# cat -n Test.txt | sed -n '/root/p'

1 root:x:0:0:root:/root:/bin/bash

10 operator:x:11:0:operator:/root:/sbin/nologin

#打印第二行:

[root@linuxidc ~]# cat -n Test.txt | sed -n '2p'

2 bin:x:1:1:bin:/bin:/sbin/nologin

[root@linuxidc ~]#

#打印第一行到,第三行:

[root@linuxidc ~]# cat -n Test.txt | sed -n '1,3p'

1 root:x:0:0:root:/root:/bin/bash

2 bin:x:1:1:bin:/bin:/sbin/nologin

3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

#打印第三行起始后三行:

[root@linuxidc ~]# cat -n Test.txt | sed -n '3,+3p'

3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

4 adm:x:3:4:adm:/var/adm:/sbin/nologin

5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

6 sync:x:5:0:sync:/sbin:/bin/sync

#打印以nologin结尾的行:(匹配)

[root@linuxidc ~]# cat -n Test.txt | sed -n '/nologin$/p'

2 bin:x:1:1:bin:/bin:/sbin/nologin

3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

4 adm:x:3:4:adm:/var/adm:/sbin/nologin

5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

10 operator:x:11:0:operator:/root:/sbin/nologin

#打印root开头行至daemon开头行

[root@linuxidc ~]# sed -n '/^root/,/^daemon/p' Test.txt

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

#打印最后一行

[root@linuxidc ~]# cat -n Test.txt | sed -n '$p'

10 operator:x:11:0:operator:/root:/sbin/nologin

#不打印最后一行:(“!”表示取反)

[root@linuxidc ~]# cat -n Test.txt | sed -n '$!p'

1 root:x:0:0:root:/root:/bin/bash

2 bin:x:1:1:bin:/bin:/sbin/nologin

3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

4 adm:x:3:4:adm:/var/adm:/sbin/nologin

5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

6 sync:x:5:0:sync:/sbin:/bin/sync

7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

8 halt:x:7:0:halt:/sbin:/sbin/halt

9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

#打印奇数行

[root@linuxidc ~]# cat -n Test.txt |sed -n '1~2p'

1 root:x:0:0:root:/root:/bin/bash

3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

#打印偶数行

[root@linuxidc ~]# cat -n Test.txt |sed -n '2~2p'

2 bin:x:1:1:bin:/bin:/sbin/nologin

4 adm:x:3:4:adm:/var/adm:/sbin/nologin

6 sync:x:5:0:sync:/sbin:/bin/sync

8 halt:x:7:0:halt:/sbin:/sbin/halt

10 operator:x:11:0:operator:/root:/sbin/nologin

#引用变量:sed命令使用单引号:变量用单引号引起来,sed命令使用双引号,解释特殊符号原有意义

[root@linuxidc ~]# a=1

[root@linuxidc ~]# b=2

[root@linuxidc ~]# cat -n Test.txt | sed -n ''$a','$b'p'

1 root:x:0:0:root:/root:/bin/bash

2 bin:x:1:1:bin:/bin:/sbin/nologin

[root@linuxidc ~]# cat -n Test.txt | sed -n "$a,"$b"p"

1 root:x:0:0:root:/root:/bin/bash

2 bin:x:1:1:bin:/bin:/sbin/nologin

匹配删除(d):

 

#删除匹配root行

[root@linuxidc ~]# cat -n Test.txt | sed '/root/d'

2 bin:x:1:1:bin:/bin:/sbin/nologin

3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

4 adm:x:3:4:adm:/var/adm:/sbin/nologin

5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

6 sync:x:5:0:sync:/sbin:/bin/sync

7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

8 halt:x:7:0:halt:/sbin:/sbin/halt

9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

#删除第二行

[root@linuxidc ~]# cat -n Test.txt | sed '2d'

1 root:x:0:0:root:/root:/bin/bash

3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

4 adm:x:3:4:adm:/var/adm:/sbin/nologin

5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

6 sync:x:5:0:sync:/sbin:/bin/sync

7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

8 halt:x:7:0:halt:/sbin:/sbin/halt

9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

10 operator:x:11:0:operator:/root:/sbin/nologin

#删除1至9行

[root@linuxidc ~]# cat -n Test.txt | sed '1,9d'

10 operator:x:11:0:operator:/root:/sbin/nologin

#删除偶数行

[root@linuxidc ~]# cat -n Test.txt | sed '2~2d'

1 root:x:0:0:root:/root:/bin/bash

3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

 #删除配置文件中以(#开头的行和空行):

 

[root@linuxidc ~]# sed '/^#/d;/^$/d' /etc/vsftpd/vsftpd.conf

anonymous_enable=YES

local_enable=YES

write_enable=YES

local_umask=022

dirmessage_enable=YES

xferlog_enable=YES

connect_from_port_20=YES

xferlog_std_format=YES

listen=NO

listen_ipv6=YES

pam_service_name=vsftpd

userlist_enable=YES

tcp_wrappers=YES

 替换(s///):

 

#替换root字符串为ROOT,s///:只是替换每行中第一个匹配到的字符串

[root@linuxidc ~]# cat -n Test.txt | sed 's/root/ROOT/'

1 ROOT:x:0:0:root:/root:/bin/bash #第一行中只有第一个root替换成ROOT

2 bin:x:1:1:bin:/bin:/sbin/nologin

3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

4 adm:x:3:4:adm:/var/adm:/sbin/nologin

5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

6 sync:x:5:0:sync:/sbin:/bin/sync

7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

8 halt:x:7:0:halt:/sbin:/sbin/halt

9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

10 operator:x:11:0:operator:/ROOT:/sbin/nologin #唯一一个root

#全局替换root字符串为ROOT,s///g

[root@linuxidc ~]# cat -n Test.txt | sed 's/root/ROOT/g'

1 ROOT:x:0:0:ROOT:/ROOT:/bin/bash

2 bin:x:1:1:bin:/bin:/sbin/nologin

3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

4 adm:x:3:4:adm:/var/adm:/sbin/nologin

5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

6 sync:x:5:0:sync:/sbin:/bin/sync

7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

8 halt:x:7:0:halt:/sbin:/sbin/halt

9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

10 operator:x:11:0:operator:/ROOT:/sbin/nologin

#正则匹配

[root@linuxidc ~]# sed -n 's/^root/ROOT/p' Test.txt

ROOT:x:0:0:root:/root:/bin/bash

#分组使用:取出基本名,目录名

[root@linuxidc ~]# dirname /etc/sysconfig/sshd

/etc/sysconfig

[root@linuxidc ~]# basename /etc/sysconfig/sshd

sshd

[root@linuxidc ~]# echo "/etc/sysconfig/sshd" | sed -r 's#(/.*/)([^/]+/?)#\1#'

/etc/sysconfig/

[root@linuxidc ~]# echo "/etc/sysconfig/sshd" | sed -r 's#(/.*/)([^/]+/?)#\2#'

sshd

#使用&命令引用匹配内容并且替换,

#注:&代表root,&.1:把root替换成root.1

[root@linuxidc ~]# cat -n Test.txt |sed 's/root/&.1/g'

1 root.1:x:0:0:root.1:/root.1:/bin/bash

......

#为1,2行添加注释

[root@linuxidc ~]# cat -n Test.txt |sed '1,2s/^/#/'

# 1 root:x:0:0:root:/root:/bin/bash

# 2 bin:x:1:1:bin:/bin:/sbin/nologin

3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

4 ADM:x:3:4:ADM:/var/ADM:/sbin/nologin

5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

 多点编辑(-e):

 

[root@linuxidc ~]# cat -n Test.txt |sed -e '4,5d' -e 's/root/ROOT/g'

1 ROOT:x:0:0:ROOT:/ROOT:/bin/bash

2 bin:x:1:1:bin:/bin:/sbin/nologin

3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

6 sync:x:5:0:sync:/sbin:/bin/sync

7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

8 halt:x:7:0:halt:/sbin:/sbin/halt

9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

10 operator:x:11:0:operator:/ROOT:/sbin/nologin

 添加/追加内容(a,i,c):

 

#i:在搜索匹配到的上一行添加

[root@linuxidc ~]# cat -n Test.txt | sed '/root/i \Root'

Root

1 root:x:0:0:root:/root:/bin/bash

2 bin:x:1:1:bin:/bin:/sbin/nologin

......

#a:在搜索匹配的下一行添加

[root@linuxidc ~]# cat -n Test.txt | sed '/root/a \Root'

1 root:x:0:0:root:/root:/bin/bash

Root

2 bin:x:1:1:bin:/bin:/sbin/nologin

3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

......

#c:替换搜索匹配的行

[root@linuxidc ~]# cat -n Test.txt | sed '/root/c \Root'

Root

2 bin:x:1:1:bin:/bin:/sbin/nologin

3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

......

 

注:同样可以指定地址单行添加,指定地址范围添加......

保存模式匹配的行至指定文件(w):

 

#匹配1,2行追加Test1

[root@linuxidc ~]# cat -n Test.txt | sed '1,2w Test1'

1 root:x:0:0:root:/root:/bin/bash

2 bin:x:1:1:bin:/bin:/sbin/nologin

3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

4 adm:x:3:4:adm:/var/adm:/sbin/nologin

5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

6 sync:x:5:0:sync:/sbin:/bin/sync

7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

8 halt:x:7:0:halt:/sbin:/sbin/halt

9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

10 operator:x:11:0:operator:/root:/sbin/nologin

[root@linuxidc ~]# cat Test1

1 root:x:0:0:root:/root:/bin/bash

2 bin:x:1:1:bin:/bin:/sbin/nologin

读取指定文件的文本追加至模式空间(r):

 

#读取/etc/RedHat-release,追加至1,2行

[root@linuxidc ~]# cat -n Test.txt | sed '1,2r /etc/redhat-release'

1 root:x:0:0:root:/root:/bin/bash

CentOS Linux release 7.2.1511 (Core)

2 bin:x:1:1:bin:/bin:/sbin/nologin

CentOS Linux release 7.2.1511 (Core)

3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

4 adm:x:3:4:adm:/var/adm:/sbin/nologin

5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

 匹配到的行号:

#=:

[root@linuxidc ~]# cat -n Test.txt | sed -n '/root/='

1

10

#!:同之前可以

原文件编辑(i):

[root@linuxidc ~]#  sed -i 's/adm/ADM/g' Test.txt

[root@linuxidc~]# cat Test.txt

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

......

 注意:由于-i参数修改原配置文件,操作比较危险,可以使用-i.bak执行,生成源文件.bak就是之前没有改动的文件(bak是自己制定,随意指定)。

 

[root@linuxidc ~]# sed -i.bak '1,7d' Test.txt

[root@linuxidc ~]# cat Test.txt

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

[root@linuxidc ~]# cat Test.txt.bak #原文件备份

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

 空间操作:

 

#取出偶数行:

[root@linuxidc ~]# cat -n Test.txt | sed -n 'n;p'

2 bin:x:1:1:bin:/bin:/sbin/nologin

4 ADM:x:3:4:ADM:/var/ADM:/sbin/nologin

6 sync:x:5:0:sync:/sbin:/bin/sync

8 halt:x:7:0:halt:/sbin:/sbin/halt

10 operator:x:11:0:operator:/root:/sbin/nologin

#取出奇数行:

[root@linuxidc ~]# cat -n Test.txt | sed 'n;d'

1 root:x:0:0:root:/root:/bin/bash

3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

 

#倒叙显示:

[root@linuxidc ~]# cat -n Test.txt |sed -n '1!G;h;$p'

10 operator:x:11:0:operator:/root:/sbin/nologin

9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

8 halt:x:7:0:halt:/sbin:/sbin/halt

7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

6 sync:x:5:0:sync:/sbin:/bin/sync

5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

4 adm:x:3:4:adm:/var/adm:/sbin/nologin

3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

2 bin:x:1:1:bin:/bin:/sbin/nologin

1 root:x:0:0:root:/root:/bin/bash

 

#打印文件最后一行:

[root@linuxidc ~]# sed 'N;D' Test.txt

operator:x:11:0:operator:/root:/sbin/nologin

 

#在每行后增加空行:

[root@linuxidc ~]# sed 'G' Test.txt

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

参考:Linux公社

https://www.linuxidc.com/Linux/2018-01/150636.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值