首页 > 代码库 > 文本处理三剑客之sed的使用
文本处理三剑客之sed的使用
文本处理三剑客之sed的使用
1、sed命令的概述
(1)sed命令概述:一种交互式的文本编辑器(行编辑器)
(2)工作原理:sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。
文件内容并没有改变,除非你使用重定向存储输出。
(3)用途:自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等
2、sed命令的使用:
(1)用法:sed[option]...‘script‘ inputfile...
(2)常用选项:
选项 | 作用 |
-n | 不输出模式空间内容到屏幕,即不自动打印 |
-e | 多点编辑 |
-f | 从指定的文件中读取编辑脚本 |
-r | 支持使用扩展的正则表达式 |
-i.bak | 备份文件并远处编辑 |
-i | 直接修改读取的内容,不在屏幕上显示 |
#多点编辑,打印2到4行,同时从第一行开始,每隔十行打印
[root@dayi123 tmp]# sed -n -e ‘2,4p‘ -e ‘1~10p‘passwd
1 root:x:0:0:root,mgedu,123456,23456:/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
11 games:x:12:100:games:/usr/games:/sbin/nologin
21 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@dayi123 tmp]# sed-i.bak /root/d passwd #修改前对源文件做备份 [root@dayi123 tmp]# head -2passwd #包含root的行已经被删除
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@dayi123 tmp]# lspasswd* #删除前对源文件做了备份
passwd passwd.bak
(3)地址定位
1)不给定地址(对全文进行处理)
[root@dayi123 ~]$seq 3 | sed-n p #打印所有行
1
2
3
2)单地址(可以使指定的一行,或被正则匹配到的行)
# | /pattern/ :匹配某一行或者被pattern匹配到的行
#打印匹配到关键字dayi123的行
#为方便练习,将/etc/passwd加行号输出到当前目录下:cat –n /etc/passwdpasswd
[root@dayi123 ~]$cat -n /etc/passwd| sed -n /dayi123/p
27 dayi123:x:502:502::/home/dayi123:/bin/bash
#打印第十行
[root@dayi123 ~]$cat -n/etc/passwd | sed -n 10p
10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
3)根据地址范围定位
#,# :根据给定行号范围匹配
#,+# :从开始的行开始匹配多少行
/pat1/,/pat2/ :从匹配到的行开始,到下一个匹配的行结束
#,/pat1/ :从匹配的行开始,到匹配的下一行结束
[root@dayi123 ~]$cat -n/etc/passwd | sed -n 10,12p #打印十到十二行
10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
11 operator:x:11:0:operator:/root:/sbin/nologin
12 games:x:12:100:games:/usr/games:/sbin/nologin
[root@dayi123 ~]$cat -n/etc/passwd | sed -n 10,+1p #从第十行开始打印一行
10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
11 operator:x:11:0:operator:/root:/sbin/nologin
#打印包含关键字tcpdump到关键字dayi123之间的行
[root@dayi123 ~]$cat -n/etc/passwd | sed -n /tcpdump/,/dayi123/p
25 tcpdump:x:72:72::/:/sbin/nologin
26 test:x:501:0::/home/test:/bin/bash
27 dayi123:x:502:502::/home/dayi123:/bin/bash
#打印从第二十六行开始到包含关键字(匹配到的第一个关键字)dayi123的行
[root@dayi123 ~]$cat -n/etc/passwd | sed -n 26,/dayi123/p
26 test:x:501:0::/home/test:/bin/bash
27 dayi123:x:502:502::/home/dayi123:/bin/bash
4)根据步长匹配:
1~2 :匹配奇数行
2~2 :匹配偶数行
#~n :从开始行隔n行匹配
[root@dayi123 ~]$cat -n/etc/passwd | sed -n 1~10p #从第一行开始隔十行打印
1 root:x:0:0:root:/root:/bin/bash
11 operator:x:11:0:operator:/root:/sbin/nologin
21 saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
[root@dayi123 ~]$cat -n/etc/passwd | sed -n 1~2p #打印奇数行
1 root:x:0:0:root:/root:/bin/bash
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@dayi123 ~]$cat -n/etc/passwd | sed -n 2~2p #打印偶数行
2 bin:x:1:1:bin:/bin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
(4)编辑命令:
选项 | 作用 |
d | 删除模式空间匹配的行 |
p | 显示模式空间中的内容 |
a | 在指定的行后面增加文本,支持\n实现多行追加 |
i | 在匹配到的行前插入文本 |
c | 替换行尾单行或多行文本 |
w | 保存模式匹配的行至指定文件 |
r | 读取指定文件的文本至模式空间中匹配到的行后 |
= | 为模式空间中的行打印行号 |
! | 模式空间中匹配行去反处理 |
1)编辑命令”d”的使用(“d”为删除,将匹配到模式空间中的行删除)
[root@dayi123 ~]$sed ‘3~10d‘passwd #从第三行开始,每隔十行删除
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@dayi123 ~]$sed ‘1~2d‘passwd #删除奇数行,打印偶数行
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
[root@dayi123 ~]$sed‘/root/d‘ passwd
2 bin:x:1:1:bin:/bin:/sbin/nologin
2)追加命令”a”的使用(“a”为追加,在匹配到的行的后面增加。)
#为包含root的行后增减一行“---------hell0-----”
[root@dayi123 ~]$sed‘/root/,/daemon/a ---------hell0-----‘ passwd
1 root:x:0:0:root:/root:/bin/bash
---------hell0-----
2 bin:x:1:1:bin:/bin:/sbin/nologin
---------hell0-----
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
---------hell0-----
#为第二行到第三行后增加“end”
[root@dayi123 ~]$sed ‘2,3aend‘ passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
end
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
end
3)追加命令”i”的使用(“i”为插入命令,在匹配到的行的前面加入一行)
#为以root开头的行前增加一行“+++++++++++start++++++++++”
[root@dayi123 ~]$sed‘/^root/i +++++++++++start++++++++++‘/etc/passwd
+++++++++++++++start+++++++++++++
root:x:0:0:root:/root:/bin/bash
#为奇数行前加一行“+++++++++++start++++++++++”
[root@dayi123 ~]$sed‘1~2i ++++++++++start+++++++++‘/etc/passwd
++++++++++start+++++++++
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
++++++++++start+++++++++
daemon:x:2:2:daemon:/sbin:/sbin/nologin
4)替换命令”c”的使用(“c”为将模式空间中匹配到的行的内容修改,原内容被覆盖)
[root@dayi123 tmp]# sed ‘/root/c ROOT‘ passwd #将有root的行替换为ROOT
ROOT
2 bin:x:1:1:bin:/bin:/sbin/nologin
#将第二行,第三行内容替换为”---------USER DELETE---------”
[root@dayi123 tmp]# sed ‘2,3c ---------USER DELETE---------‘ passwd
1 root:x:0:0:root,mgedu,123456,23456:/root:/bin/bash
---------USER DELETE---------
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
#从第二行开始,每隔三行内容替换为”---------USER DELETE---------”
[root@dayi123 tmp]# sed ‘2~3c ---------USER DELETE---------‘ passwd
1 root:x:0:0:root,mgedu,123456,23456:/root:/bin/bash
---------USER DELETE---------
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
---------USER DELETE---------
5)保存匹配模式行至指定文件”w”命令的使用(“w”为将匹配到的模式空间的行添加到输出到一个文件,文件不存在时会创建,文件存在时会将源文件内容覆盖)
[root@dayi123 tmp]# sed-n ‘2~3w a.txt‘ passwd #将匹配到的内容输出到a.txt
[root@dayi123 tmp]# cat a.txt
2 bin:x:1:1:bin:/bin:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
……
#将包含tss及passwd之间的行保存到文件b.txt
[root@dayi123 tmp]# sed -n‘/tss/,/dayi123/w b.txt‘ passwd
[root@dayi123 tmp]# cat b.txt
19 tss:x:59:59:Account used by the trousers package to sandbox the tcsd
daemon:/dev/null:/sbin/nologin
20 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
21 dayi123:x:1000:1000::/home/dayi123:/bin/bash
6)读取文件内容添加到匹配模式行后”r”命令的使用(“r”为将将某个文件的内容添加到模式空间中匹配到行的下一行,不会覆盖下一行的源内容)
#将c.txt中的内容添加到第一行后面
[root@dayi123 tmp]# sed ‘1r c.txt‘ passwd
1 root:x:0:0:root,mgedu,123456,23456:/root:/bin/bash
19 tss:x:59:59:Account used by the trousers package to sandbox the tcsd
daemon:/dev/null:/sbin/nologin
20 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
21 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
#为/etc/passwd中以dayi123开头的行后加入文件f中的内容
[root@dayi123 tmp]# sed"/^dayi123/r f" /etc/passwd
dayi123:x:1000:1000::/home/dayi123:/bin/bash
============this isdayi123=============
7)为模式空间中的行打印行号”=”命令的使用(“=”为匹配到模式空间中内容输出行号,行号会显示到匹配行的前一行)
#为以root开头的行加上行号,行号会加在行前一行
[root@dayi123 tmp]# sed"/^root/=" /etc/passwd
1
root:x:0:0:root,mgedu,123456,23456:/root:/bin/bash
[root@dayi123 tmp]# sed"3,5=" /etc/passwd #为第三行到第五行添加行号
root:x:0:0:root,mgedu,123456,23456:/root:/bin/bash
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
8)为模式空间中匹配行取反”!”命令的使用(“!”为编辑命令取反,得到的结果为与非匹配到模式空间中的内容执行编辑命令)
[root@dayi123 tmp]# sed"3,5!=" /etc/passwd #除三到五行外,其他行加行号
1
root:x:0:0:root,mgedu,123456,23456:/root:/bin/bash
2
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
6
[root@dayi123 tmp]# seq 10 |sed -n ‘1~2!p‘ #打印偶数行
2
4
……
(5)编辑命令:
命令 | 作用 |
g | 行内全局替换 |
p | 显示替换成功的行 |
w | 将替换成功的行保存至文件中 |
#将所有的root替换成deletl user
[root@dayi123 tmp]# sed -i‘s#root#delete user#g‘ passwd
[root@dayi123 tmp]# catpasswd
1 delete user:x:0:0:deleteuser,mgedu,123456,23456:/delete
user:/bin/bash
#关闭selinux并将修改结果保存到selinux文件中
[root@dayi123 tmp]# sed -i "s#SELINUX=enforcing#SELINUX=disabled#wselinux"
/etc/selinux/config
[root@dayi123 tmp]# catselinux
SELINUX=disabled
3、sed命令的高级使用
(1)模式空间与保持空间
1)模式空间:容纳当前输入行的缓冲区(一般的数据处理只使用模式空间)
2)保持空间:进行数据处理的时候,作为数据的暂存区域(sed高级编辑命令需要用到保持空间)
(2)高级编辑命令
命令 | 作用 |
h | 把模式空间中的内容覆盖至保持空间中 |
H | 把模式空间的内容追加至保持空间中 |
g | 从保持空间取出数据覆盖至模式空间 |
G | 从保持空间取出内容追加至模式空间 |
x | 把模式空间于保持空间的内容进行互换 |
n | 读取匹配到的行的下一行覆盖至模式空间 |
N | 读取匹配到的行的下一行追加至模式空间 |
d | 删除模式空间中的行(所有行) |
D | 删除当前模式空间开端至\n的内容(不再传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed(删除模式空间中的一行) |
1)d,D的用法
#打印最后一行(如果不是最后一行就删除)
[root@dayi123 tmp]# sed ‘$!d‘ passwd
87 user20:x:1041:1024::/home/user20:/bin/bash
#不是最后一行则删除,此处用法同“d”
[root@dayi123 tmp]# sed ‘$!D‘ passwd
87 user20:x:1041:1024::/home/user20:/bin/bash
#打印ip地址
[root@dayi123 tmp]# ifconfigeth0|sed ‘2!d;s/^.*et //;s/ .*//‘ #centos7
172.16.250.102
[root@dayi123-6 ~]# ifconfigeth0 | sed ‘2!d;s/^.*dr://;s/ .*//‘ #centos6
172.16.254.250
[root@dayi123 tmp]# seq100|sed ‘$!N;$!D‘ #打印最后两行
99
100
2)n,N的用法
#打印奇数行(将匹配到的行的下一行覆盖至模式空间,后从模式空间删除)
[root@dayi123 tmp]# sed ‘n;d‘ passwd
1 root:x:0:0:root,mgedu,123456,23456:/root:/bin/bash
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
#打印偶数行(将匹配到的行的下一行覆盖至模式空间,用下一行覆盖当前行,并打印)
[root@dayi123 tmp]# sed -n ‘n;p‘ passwd
2 bin:x:1:1:bin:/bin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
3)其他命令的使用
[root@dayi123 tmp]# seq 3|sed‘1!G;h;$!d‘ #文件内容倒过来打印
3
2
1
[root@dayi123 tmp]# seq 3|sed-n ‘1!G;h;$p‘ #文件内容倒过来打印
3
2
1
本文出自 “dayi123” 博客,请务必保留此出处http://dayi123.blog.51cto.com/12064061/1920616
文本处理三剑客之sed的使用