码迷,mamicode.com
首页 > 其他好文 > 详细

3.13 9.4-9.5听课笔记

时间:2018-03-14 00:23:55      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:sed   正则   

Sed

 

打印、匹配行

 

[[email protected] sed]# sed '/root/'p test.txt sed’匹配特定的字符

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

 

-n 不匹配的行不显示每行只显示一次

[[email protected] sed]# sed -n '/root/'p test.txt

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

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

 

[[email protected] sed]# sed -n '/r.t/'p test.txt

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

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

 

[[email protected] sed]# sed -n '/r*t/'p test.txt

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

sh1outdown:x:6:o1o0:s1ohutd1ooown:/sbin:/sbin/shutdown

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

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

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

dbus:x:81:81:System message bus:/:/sbin/nologin

polkitd:x:999:997:User for polkitd:/:/sbin/nologin

postfix:x:89:89::/var/spool/postfix:/sbin/nologin

 

[[email protected] sed]# sed -n '/r\+t/'p test.txt 正常使用+需要脱义

[[email protected] sed]# sed -nr '/r+t/'p test.txt -r参数则不需要脱

 

[[email protected] sed]# sed -nr '/o{2}/'p test.txt

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

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

sh1outdown:x:6:o1o0:s1ohutd1ooown:/sbin:/sbin/shutdown

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

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

postfix:x:89:89::/var/spool/postfix:/sbin/nologin

 

[[email protected] sed]# sed -nr '/root|bus/'p test.txt 或者

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

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

dbus:x:81:81:System message bus:/:/sbin/nologin

 

[[email protected] sed]# sed -n '2'p test.txt 打印第2

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

[[email protected] sed]# sed -n '2,5'p test.txt 打印第25

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

[[email protected] sed]# sed -n '5,$'p test.txt 打印第5行后所有的行

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

sync:x:5:0:sync:/oaosbin:/bin/sync

sh1outdown:x:6:o1o0:s1ohutd1ooown:/sbin:/sbin/shutdown

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

[[email protected] sed]# sed -n '1,$'p test.txt 打印全部内容

 

[[email protected] sed]# sed -e '1'p -e '/bus/'p -n test.txt

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

dbus:x:81:81:System message bus:/:/sbin/nologin

[[email protected] sed]# sed -e '1'p -e '/root/'p -n test.txt

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

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

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

*-e一次执行多个项目,若显示的结果中存在重复的行则会重复显示

 

[[email protected] sed]# sed -n '/bus/'Ip test.txt I(大写i)不区分大小写

dbus:x:81:81:System message bus:/:/sbin/nologin

bus

BUS

Bus

Bus

 

删除指定行

 

案例:

需要删除一个庞大的日志文件中前几个月的内容,只留最后一个月(日志都含有时间戳

 

[[email protected] sed]# egrep -n '#*2018.3.12|#*2018.3.13' aa

1:#######2018.3.12

11:#######2018.3.13

[[email protected] sed]# sed '2,10'd aa

#######2018.3.12

#######2018.3.13

fhuqieh

fdgda

dsgfa

rgqe

adga

*以上命令并没有直接删除文件aa中的内容,只是不会显示2-10行的内容,但对文件本身无任何修改

 

-I 彻底删除aa文件中对应的行

[[email protected] sed]# sed -i '2,10'd aa

[[email protected] sed]# cat aa

#######2018.3.12

#######2018.3.13

fhuqieh

fdgda

dsgfa

rgqe

adga

 

删除有hyc字段的行

[[email protected] sed]# sed -i '/hyc/'d passwd.bak

[[email protected] sed]# grep 'hyc' passwd.bak

[[email protected] sed]#

 

替换字符

[[email protected] sed]# sed '1,10s/root/toor/g' passwd.bak

toor:x:0:0:toor:/toor:/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

 

[[email protected] sed]# sed -r '1,10s/ro+/r/g' passwd.bak |head

rt:x:0:0:rt:/rt:/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:/rt:/sbin/nologin

*写替换内容时可以使用正则,但需要在sed后加-r选项才能识别正则

 

[[email protected] sed]# sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' bb

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

*将一行最后一个:后的内容与第一个:之前的内容替换

S表示替换行,默认未写明则替换所有行内容;

每个()内的内容都可以当做一个整体;

为()内的内容从左到右排序123;

第一个():一个或多个除:外的任意字符;

第二个():任意个任意字符

第三个():同第一个;

贪婪匹配:第二个()的内容表示任意个任意字符,它之后的:匹配的是每一行最后一次出现的:;

前面的([^:]+)在后面需要用\3表示

*/字符过多可能导致系统无法区分可用#@代替,也可以在/前面加\脱义

 

删除文档中所有的英文字母

[[email protected] sed]# sed 's/[a-zA-Z]//g' bb 用空内容代替字母

::0:0::/://

 

在所有行的前面加字符串

[[email protected] sed]# sed -r 's/(.*)/aaa&/' bb

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

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

[[email protected] sed]# sed -r 's/(.*)/aaa\1/' bb

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

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

 

问题:

[[email protected] sed]# sed -r 's/(.*)/aaa\1/' a > a

[[email protected] sed]# cat a

[[email protected] sed]# sed -r 's/(.*)/aaa\1/' a.bak >> a.bak

[[email protected] sed]# cat a.bak

dgdarfagr

aaadgdarfagr


3.13 9.4-9.5听课笔记

标签:sed   正则   

原文地址:http://blog.51cto.com/12216458/2086286

(0)
(0)
   
举报
评论 一句话评论(0
0条  
登录后才能评论!
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!