文本处理三剑客之sed的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文本处理三剑客之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行,同时从第一行开始,每隔十行打印

[[email protected] 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

[[email protected] tmp]# sed-i.bak /root/d passwd  #修改前对源文件做备份               [[email protected] tmp]# head -2passwd         #包含root的行已经被删除

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

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

[[email protected] tmp]# lspasswd*    #删除前对源文件做了备份

passwd  passwd.bak

(3)地址定位

   1)不给定地址(对全文进行处理)

[[email protected] ~]$seq 3 | sed-n p    #打印所有行

1

2

3

   2)单地址(可以使指定的一行,或被正则匹配到的行)

     # | /pattern/  :匹配某一行或者被pattern匹配到的行

#打印匹配到关键字dayi123的行

#为方便练习,将/etc/passwd加行号输出到当前目录下:cat –n /etc/passwdpasswd

[[email protected] ~]$cat -n /etc/passwd| sed -n /dayi123/p

   27 dayi123:x:502:502::/home/dayi123:/bin/bash

#打印第十行

[[email protected] ~]$cat -n/etc/passwd | sed -n 10p      

   10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

   3)根据地址范围定位

     #,# :根据给定行号范围匹配

     #,+# :从开始的行开始匹配多少行

     /pat1/,/pat2/ :从匹配到的行开始,到下一个匹配的行结束

     #,/pat1/ :从匹配的行开始,到匹配的下一行结束

[[email protected] ~]$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

[[email protected] ~]$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之间的行

[[email protected] ~]$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的行

[[email protected] ~]$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行匹配

[[email protected] ~]$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

[[email protected] ~]$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

[[email protected] ~]$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”为删除,将匹配到模式空间中的行删除)

[[email protected] ~]$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

[[email protected] ~]$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

[[email protected] ~]$sed‘/root/d‘ passwd

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

   2)追加命令”a”的使用(“a”为追加,在匹配到的行的后面增加。)

#为包含root的行后增减一行“---------hell0-----”

[[email protected] ~]$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”

[[email protected] ~]$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++++++++++”

[[email protected] ~]$sed‘/^root/i  +++++++++++start++++++++++‘/etc/passwd

+++++++++++++++start+++++++++++++

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

#为奇数行前加一行“+++++++++++start++++++++++”

[[email protected] ~]$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”为将模式空间中匹配到的行的内容修改,原内容被覆盖)

[[email protected] tmp]# sed  ‘/root/c ROOT‘ passwd   #将有root的行替换为ROOT

ROOT

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

#将第二行,第三行内容替换为”---------USER DELETE---------”

[[email protected] 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---------”

[[email protected] 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”为将匹配到的模式空间的行添加到输出到一个文件,文件不存在时会创建,文件存在时会将源文件内容覆盖)

[[email protected] tmp]# sed-n  ‘2~3w a.txt‘ passwd #将匹配到的内容输出到a.txt

[[email protected] 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

[[email protected] tmp]# sed -n‘/tss/,/dayi123/w b.txt‘ passwd  

[[email protected] 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中的内容添加到第一行后面

[[email protected] 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中的内容

[[email protected] tmp]# sed"/^dayi123/r f" /etc/passwd

dayi123:x:1000:1000::/home/dayi123:/bin/bash

============this isdayi123=============

   7)为模式空间中的行打印行号”=”命令的使用(“=”为匹配到模式空间中内容输出行号,行号会显示到匹配行的前一行)

#为以root开头的行加上行号,行号会加在行前一行

[[email protected] tmp]# sed"/^root/=" /etc/passwd         

1

root:x:0:0:root,mgedu,123456,23456:/root:/bin/bash

[[email protected] 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)为模式空间中匹配行取反”!”命令的使用(“!”为编辑命令取反,得到的结果为与非匹配到模式空间中的内容执行编辑命令)

[[email protected] 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

[[email protected] tmp]# seq 10 |sed -n ‘1~2!p‘  #打印偶数行

2

4

……

(5)编辑命令:

命令

作用

g

行内全局替换

p

显示替换成功的行

w

将替换成功的行保存至文件中

#将所有的root替换成deletl user

[[email protected] tmp]# sed -i‘s#root#delete user#g‘ passwd  

[[email protected] tmp]# catpasswd

     1 delete user:x:0:0:deleteuser,mgedu,123456,23456:/delete

 user:/bin/bash

#关闭selinux并将修改结果保存到selinux文件中

[[email protected] tmp]# sed -i "s#SELINUX=enforcing#SELINUX=disabled#wselinux"

 /etc/selinux/config 

[[email protected] 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的用法

#打印最后一行(如果不是最后一行就删除)

[[email protected] tmp]# sed  ‘$!d‘ passwd 

    87 user20:x:1041:1024::/home/user20:/bin/bash

#不是最后一行则删除,此处用法同“d”

[[email protected] tmp]# sed  ‘$!D‘ passwd   

    87 user20:x:1041:1024::/home/user20:/bin/bash

#打印ip地址

[[email protected] tmp]# ifconfigeth0|sed ‘2!d;s/^.*et //;s/ .*//‘ #centos7

172.16.250.102

[[email protected] ~]# ifconfigeth0 | sed ‘2!d;s/^.*dr://;s/ .*//‘ #centos6

172.16.254.250

[[email protected] tmp]# seq100|sed ‘$!N;$!D‘  #打印最后两行

99

100

   2)n,N的用法

#打印奇数行(将匹配到的行的下一行覆盖至模式空间,后从模式空间删除)

[[email protected] 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

#打印偶数行(将匹配到的行的下一行覆盖至模式空间,用下一行覆盖当前行,并打印)

 [[email protected] 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)其他命令的使用

[[email protected] tmp]# seq 3|sed‘1!G;h;$!d‘   #文件内容倒过来打印

3

2

1

[[email protected] tmp]# seq 3|sed-n ‘1!G;h;$p‘  #文件内容倒过来打印

3

2

1


本文出自 “dayi123” 博客,请务必保留此出处http://dayi123.blog.51cto.com/12064061/1920616

以上是关于文本处理三剑客之sed的使用的主要内容,如果未能解决你的问题,请参考以下文章

文本处理三剑客之 sed

文本处理三剑客之SED

文本三剑客之sed

文本三剑客之sed

Linux文本处理三剑客之sed

文本处理三剑客之SED