day27:三剑客之sed

sed命令:sed是一种流编辑器,它是文本处理非常重要的工具,它和grep一样,也支持grep的所有功能,比如过滤和查找,sed最主要的功能是替换:方便快捷:

           处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

sed语法:sed   options   commond   filename           #使用语法

options:

-n只显示当前符合要求的行:(sed默认会显示所有行,并且重复打印两行无颜色显示):

-p查找,查找时需要加此选项了

-d删除,删除并输出在屏幕,不会修改源文件内容

-i加此选项会自己修改源文件内容,需要结合替换和删除时使用

-e可以过滤多个选项,加上此选项后,支持多个过滤条件

-r加上此选项后若表达式中有特殊字符则不需要使用脱义字符

's###g'  =  's@@@g'   =     's///g':表示替换字符:可用#=@=/都可以的:

2、案例:

[root@localhost sed]# sed '/root/'p test.txt|head -8     #过滤出包含'root'行,并打印两次:还会打印所有行:
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
rt
rrt
BUSSDFLSKFLkjlsfsfs
Bin:x:1:1:bin:/bin:/sbin/NOLogin
daemon:x:2:2:daemon:/sbin:/sbin/noooologin
adm:x:3:4:adm:/var/adm:/sbin/noologin
[root@localhost sed]# sed -n '/root/'p test.txt        #只打印出符合要求的行:
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

3、同时也支持“ . ”  " * "   " + "    " ? "      这些特殊字符:

[root@localhost sed]# sed -n '/o.t/'p test.txt      #过滤一个字符:
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
[root@localhost sed]# sed -n '/o*t/'p test.txt      #过滤零个或多个前面的字符:
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

如果需要使用"  +  "   " ? "  “  |   ”特殊字符,需要加脱义选项或者“ -r ”选项:

[root@localhost sed]# sed -n '/o+t/'p test.txt   #什么也不显示,需要加脱义才可以:
[root@localhost sed]# sed -n '/o\+t/'p test.txt       #过滤出一个或多个字符:
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost sed]# sed -n '/o\?t/'p test.txt       #过滤出零个多一个字符:
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@localhost sed]# sed -nr '/o+t/'p test.txt      #或者加-r选项也可以的:
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost sed]# sed -nr "/root|bash/"p test.txt    #或者,过滤出root或者bash的:
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
yuanhh:x:1000:1000::/home/yuanhh:/bin/bash

4、忽略大小写:  I

[root@localhost sed]# sed -n '/root/'Ip test.txt    #过滤出test.txt的文件中的root,不区分大小写:
root:x:0:0:root:/root:/bin/bash
ROOT:x:0:0:root:/root:/bin/bash
ROOT:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

5、打印行:  打印指定行

[root@localhost sed]# sed  -n '2'p test.txt       #只打印第二行:‘2’p
ROOT:x:0:0:root:/root:/bin/bash
[root@localhost sed]# sed  -n '2,5'p test.txt     #只打印第二行到第五行:‘2,5’p
ROOT:x:0:0:root:/root:/bin/bash
ROOT:x:0:0:root:/root:/bin/bash
BUSSDFLSKFLkjlsfsfs
Bin:x:1:1:bin:/bin:/sbin/NOLogin
[root@localhost sed]# sed  -n '25,$'p test.txt     #打印25号到末行:‘25,$’p
ntp:x:38:38::/etc/ntp:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/NOlogin
yuanhh:x:1000:1000::/home/yuanhh:/bin/bash
[root@localhost sed]# sed  -n '/^1/'p test.txt     #只打印以数字1开头的行:   ‘/^1/’p
11111111
[root@localhost sed]# sed  -n '/1$/'p test.txt     #只打印以数字1结尾的行:    ‘1$/’p
11111111

6、在同一个行内执行多个命令:   -e

[root@localhost sed]# sed -ne '1'p -e '/bus/'p test.txt     #打印出第一行和包含bus的行:
root:x:0:0:root:/root:/bin/bash
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
[root@localhost sed]# sed -ne '1'p -e '/root/'p test.txt     #打印第一行和包含root的行:
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash

解读:sed -ne '1'p -e '/root/'p test.txt该命令的意思是:打印第一行,同时打印出匹配root的行,当打印的内容和匹配的内容相同时,会分别显示,即:两个命令同时进行但相对独立:

7、删除指定行-d

[root@localhost sed]# cat -n test.txt|sed '1,25'd    #删除其1到25行:
    26  yuanhh:x:1000:1000::/home/yuanhh:/bin/bash

注:这种方法不会删除文件内容,只会删除了输出在屏幕上的指定行,如果想修改文件内容呢,那需要怎么做呢:

8、修改文件内容 -i   结合替换和删除使用:

[root@localhost sed]# wc -l test1             #查看当前的行:
26 test1
[root@localhost sed]# sed -i '1,24'd test1    #删除其1到25行:
[root@localhost sed]# wc -l test1             #再次查看还有2行:
2 test1

9、sed的替换功能:

test文档里面的root替换为toor:

[root@localhost sed]# sed '1,10s/root/toor/g' test.txt   #把文档里面的root替换为toor:
toor:x:0:0:toor:/toor:/bin/bash
11111111
BUSSDFLSKFLkjlsfsfs
Bin:x:1:1:bin:/bin:/sbin/NOLogin


[root@localhost sed]# sed -r '1,10s/ro+/r/g' test.txt  #如在文档里使用特殊符号,则需要用-r或者‘/’来脱义:
rt:x:0:0:rt:/rt:/bin/bash
11111111
BUSSDFLSKFLkjlsfsfs
Bin:x:1:1:bin:/bin:/sbin/NOLogin
daemon:x:2:2:daemon:/sbin:/sbin/noooologin

#注意:如在文档里使用特殊符号,则需要用-r者‘/’来脱义:

把test文档里面第一段最后一段调换位置:

[root@localhost sed]# head test.txt|sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1:/g'
/bin/bash:x:0:0:root:/root:root:
11111111
BUSSDFLSKFLkjlsfsfs
/sbin/NOLogin:x:1:1:bin:/bin:Bin:
/sbin/noooologin:x:2:2:daemon:/sbin:daemon:
/sbin/noologin:x:3:4:adm:/var/adm:adm:
/sbin/nooologin:x:4:7:lp:/var/spool/lpd:lp:

[root@localhost sed]# head test.txt|sed -r 's#([^:]+):(.*):([^:]+)#\3:\2:\1#g'
/bin/bash:x:0:0:root:/root:root
11111111
BUSSDFLSKFLkjlsfsfs
/sbin/NOLogin:x:1:1:bin:/bin:Bin
/sbin/noooologin:x:2:2:daemon:/sbin:daemon
/sbin/noologin:x:3:4:adm:/var/adm:adm

如上:如上两种方法均可以的

也可以只把root替换为123:如下:

[root@localhost sed]# head test.txt|sed 's#/root#123#g'      #把test.txt文档中的root替换为123:
root:x:0:0:root:123:/bin/bash
11111111
BUSSDFLSKFLkjlsfsfs
Bin:x:1:1:bin:/bin:/sbin/NOLogin
daemon:x:2:2:daemon:/sbin:/sbin/noooologin
adm:x:3:4:adm:/var/adm:/sbin/noologin
[root@localhost sed]# head test.txt|sed 's/\/root/123/g'     #把root替换123:不过root需要脱义:
root:x:0:0:root:123:/bin/bash
11111111
BUSSDFLSKFLkjlsfsfs
Bin:x:1:1:bin:/bin:/sbin/NOLogin
daemon:x:2:2:daemon:/sbin:/sbin/noooologin

删除内容:替换为空 即可:

[root@localhost sed]# head -10 test.txt|sed 's#[0-9a-zA-Z]##g'   #把前10行替换为空:
:::::/://
:::::/://
:::::/://
::::://://
:::::///://

附加:在所有行的前面加字母:

[root@localhost sed]# head -10 test.txt|sed -r 's#^#aaa:#'             #第一种方式:
aaa:root:x:0:0:root:/root:/bin/bash
aaa:adm:x:3:4:adm:/var/adm:/sbin/noologin
aaa:lp:x:4:7:lp:/var/spool/lpd:/sbin/nooologin
aaa:sync:x:5:0:sync:/sbin:/bin/sync
aaa:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
aaa:halt:x:7:0:halt:/sbin:/sbin/halt
[root@localhost sed]# head -10 test.txt|sed -r 's#(.*)#aaa:\1#g'      #第二种方式:
aaa:root:x:0:0:root:/root:/bin/bash
aaa:adm:x:3:4:adm:/var/adm:/sbin/noologin
aaa:lp:x:4:7:lp:/var/spool/lpd:/sbin/nooologin
aaa:sync:x:5:0:sync:/sbin:/bin/sync
aaa:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
aaa:halt:x:7:0:halt:/sbin:/sbin/halt
[root@localhost sed]# head -10 test.txt|sed -r 's#(.*)#aaa:&#g'      #第三种方式:
aaa:root:x:0:0:root:/root:/bin/bash
aaa:lp:x:4:7:lp:/var/spool/lpd:/sbin/nooologin
aaa:sync:x:5:0:sync:/sbin:/bin/sync
aaa:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
aaa:halt:x:7:0:halt:/sbin:/sbin/halt

说明:如上图:     &符号===\1         均代表前括号里面的字符

sed转换大小写字母

1、首字母小写变大写

[root@localhost sed]# head -10 test.txt|sed  's#\b[a-z]#\U&#g'    #首字母小写变大写:
Root:X:0:0:Root:/Root:/Bin/Bash
Lp:X:4:7:Lp:/Var/Spool/Lpd:/Sbin/Nooologin
Sync:X:5:0:Sync:/Sbin:/Bin/Sync
Shutdown:X:6:0:Shutdown:/Sbin:/Sbin/Shutdown
Halt:X:7:0:Halt:/Sbin:/Sbin/Halt

2、文档全部内容小写变大写

[root@localhost sed]# head -10 test.txt|sed 's#[a-z]#\U&#g'    #文档全部内容小写变大写:
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
LP:X:4:7:LP:/VAR/SPOOL/LPD:/SBIN/NOOOLOGIN
SYNC:X:5:0:SYNC:/SBIN:/BIN/SYNC
SHUTDOWN:X:6:0:SHUTDOWN:/SBIN:/SBIN/SHUTDOWN
HALT:X:7:0:HALT:/SBIN:/SBIN/HALT

3、文档全部大写变小写

[root@localhost sed]# sed -i 's#[a-z]#\U&#g' test.txt     #首先把文档内容全部小写变成大写:
[root@localhost sed]# head -10 test.txt|sed 's#[A-Z]#\l&#g'   #然后再把内容大写变成小写:
root:x:0:0:root:/root:/bin/bash
11111111
bussdflskflkjlsfsfs
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/noooologin
adm:x:3:4:adm:/var/adm:/sbin/noologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nooologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/yuanhaohao/blog/1852855

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值