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

工作原理:

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

0a035a1e47fed8a5abd52e6f4fc2cbc9.png

语法:

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

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

常用option参数(+描述):

--help:

获取帮助信息;

-n:

不输出模式空间内容到屏幕,即不自动打印,配合编辑命令只打印符合条件字符串;

-e:

多点编辑,可添加多个脚本;

-f:

/PATH/SCRIPT_FILE,从指定文件中读取编辑脚本;

-i:

原文件编辑(直接修改原处理文件),不添加-i参数,不会对原文件进行修改;

-r :

支持使用扩展的正则表达式;

Script:

地址+命令

地址:

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

2.单地址:

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

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

3.范围地址:

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

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

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

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

4.~:步进

1~2:奇数行

2~2:偶数行

编辑命令:

d:

删除模式空间匹配的行;

p:

显示模式空间中的内容;

a \text:

在指定行后追加文本,支持使用\n多行追加文本;

i \test:

在行前面插入文本,支持使用\n实现多行插入;

c \test:

替换行为单行或多行文本;

w /PATH/Somefile:

保存模式匹配的行至指定文件;

r /PATH/Somefile:

读取指定文件的文本至模式空间中匹配到的行后;

=:

为模式空间中的行打印行号;

!:

模式空间中匹配行取反操作;

sed查找替换:

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

s@@@

s###

替换标记:

g:行内全局替换;

p:显示替换成功的行;

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

操作原文件:

5f222952073459cd304b575c59c65fc4.gif

[root@linuxidc ~]# cat -n Test.txt1 root:x:0:0:root:/root:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync

7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8 halt:x:7:0:halt:/sbin:/sbin/halt9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10 operator:x:11:0:operator:/root:/sbin/nologin

View Code

匹配打印(p):

5f222952073459cd304b575c59c65fc4.gif

#打印匹配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/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown: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/bash10 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/bash2 bin:x:1:1:bin:/bin:/sbin/nologin3 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/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6 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/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10 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/bash2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync

7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8 halt:x:7:0:halt:/sbin:/sbin/halt9 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/bash3 daemon:x:2:2:daemon:/sbin:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown9 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/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync

8 halt:x:7:0:halt:/sbin:/sbin/halt10 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/bash2 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/bash2 bin:x:1:1:bin:/bin:/sbin/nologin

View Code

匹配删除(d):

5f222952073459cd304b575c59c65fc4.gif

#删除匹配root行

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

2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync

7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8 halt:x:7:0:halt:/sbin:/sbin/halt9 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/bash3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync

7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8 halt:x:7:0:halt:/sbin:/sbin/halt9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10 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/bash3 daemon:x:2:2:daemon:/sbin:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

View Code

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

5f222952073459cd304b575c59c65fc4.gif

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

anonymous_enable=YES

local_enable=YES

write_enable=YES

local_umask=022dirmessage_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

View Code

替换(s///):

5f222952073459cd304b575c59c65fc4.gif

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

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

1 ROOT:x:0:0:root:/root:/bin/bash #第一行中只有第一个root替换成ROOT2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync

7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8 halt:x:7:0:halt:/sbin:/sbin/halt9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10 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/bash2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync

7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8 halt:x:7:0:halt:/sbin:/sbin/halt9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10 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/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 ADM:x:3:4:ADM:/var/ADM:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

View Code

多点编辑(-e):

5f222952073459cd304b575c59c65fc4.gif

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

1 ROOT:x:0:0:ROOT:/ROOT:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync

7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8 halt:x:7:0:halt:/sbin:/sbin/halt9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10 operator:x:11:0:operator:/ROOT:/sbin/nologin

多点编辑

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

5f222952073459cd304b575c59c65fc4.gif

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

[root@linuxidc~]# cat -n Test.txt | sed '/root/i \Root'Root1 root:x:0:0:root:/root:/bin/bash2 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

Root2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

......

#c:替换搜索匹配的行

[root@linuxidc~]# cat -n Test.txt | sed '/root/c \Root'Root2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

......

View Code

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

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

5f222952073459cd304b575c59c65fc4.gif

#匹配1,2行追加Test1

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

1 root:x:0:0:root:/root:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync

7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8 halt:x:7:0:halt:/sbin:/sbin/halt9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10 operator:x:11:0:operator:/root:/sbin/nologin

[root@linuxidc~]# catTest11 root:x:0:0:root:/root:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologin

View Code

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

5f222952073459cd304b575c59c65fc4.gif

#读取/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 release7.2.1511(Core)2 bin:x:1:1:bin:/bin:/sbin/nologin

CentOS Linux release7.2.1511(Core)3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

View Code

匹配到的行号:

5f222952073459cd304b575c59c65fc4.gif

#=:

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

1

10#!:同之前可以

View Code

原文件编辑(i):

5f222952073459cd304b575c59c65fc4.gif

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

[root@linuxidc~]# catTest.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

......

View Code

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

5f222952073459cd304b575c59c65fc4.gif

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

[root@linuxidc~]# catTest.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~]# catTest.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/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown: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

View Code

空间操作:

n:

读取匹配到的行的下一行覆盖至模式空间;

N:

读取匹配到的行的下一行追加至模式空间;

h:

模式空间中内容覆盖至保持空间中;

H:

模式空间中的内容追加至保持空间中;

g:

从保持空间取出数据覆盖至模式空间;

G:

从保持空间取出内容追加至模式空间;

d:

删除模式空间中的行;

D:

删除当前模式空间开端至\n的内容(不在传至标准输出),放弃之后的命令,对剩余模式空间重新执行sed;

x:

模式空间中内容与保持空间内容进行互换;

5f222952073459cd304b575c59c65fc4.gif

#取出偶数行:

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

2 bin:x:1:1:bin:/bin:/sbin/nologin4 ADM:x:3:4:ADM:/var/ADM:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync

8 halt:x:7:0:halt:/sbin:/sbin/halt10 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/bash3 daemon:x:2:2:daemon:/sbin:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown9 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/nologin9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin8 halt:x:7:0:halt:/sbin:/sbin/halt7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown6 sync:x:5:0:sync:/sbin:/bin/sync

5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin2 bin:x:1:1:bin:/bin:/sbin/nologin1 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

......

0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值