《老段带你学sed(上)》笔记

一、sed工做流程
mysql

文件aa,首先读取文件第一行,无论你是操做仍是不操做,把结果输出在屏幕上,而后再读取第二行内容督导内存中去执行,读取每行的时候都是读到内存中的,模式空间。即便文件很大,不会消耗的内存空间。在模式空间里执行命令。正则表达式

二、sed语法sql

sed ‘范围(条件) 命令’file  知足条件才执行命令,默认不知足条件也显示结果apache

      d:删bash

[root@mail ~]# sed 'd' 1.log
[root@mail ~]#           //没有显示,由于读取一行删除一行       

      范围:使用数字,表示第多少行。使用“,”号,从第几行到第几行。$最后一行。~间隔ide

[root@mail ~]# cat -n 2.log |sed '5d'   //删除第五行
     1    PID TTY          TIME CMD
     2      1 ?        00:00:01 init
     3      2 ?        00:00:00 kthreadd
     4      3 ?        00:00:00 migration/0
     6      5 ?        00:00:00 migration/0
     7      6 ?        00:00:00 watchdog/0
     8      7 ?        00:00:02 events/0
     9      8 ?        00:00:00 cgroup
    10      9 ?        00:00:00 khelper
[root@mail ~]# cat -n 2.log |sed '5,10d'   //删除第5到第10行
     1    PID TTY          TIME CMD
     2      1 ?        00:00:01 init
     3      2 ?        00:00:00 kthreadd
     4      3 ?        00:00:00 migration/0
[root@mail ~]# cat -n 2.log |sed '$d'  //删除最后一行
     1    PID TTY          TIME CMD
     2      1 ?        00:00:01 init
     3      2 ?        00:00:00 kthreadd
     4      3 ?        00:00:00 migration/0
     5      4 ?        00:00:00 ksoftirqd/0
     6      5 ?        00:00:00 migration/0
     7      6 ?        00:00:00 watchdog/0
     8      7 ?        00:00:02 events/0
     9      8 ?        00:00:00 cgroup
[root@mail ~]# cat -n 2.log |sed '1 ~ 2 d'  //第一行开始,间隔为2删除
     2      1 ?        00:00:01 init
     4      3 ?        00:00:00 migration/0
     6      5 ?        00:00:00 migration/0
     8      7 ?        00:00:02 events/0
    10      9 ?        00:00:00 khelper

正则表达式://引发来,知足条件就执行命令atom

[root@mail ~]# cat 3.txt
root
mysql
mysql sad
aaatom
tom fds
dddd
tom
[root@mail ~]# sed '/tom/d' 3.txt  //删除包含tom的行
root
mysql
mysql sad
dddd
[root@mail ~]# sed '/^tom/,/tom$/d' 3.txt   //删除以tom开头和tom结尾的行
root
mysql
mysql sad
[root@mail ~]# sed '/\btom\b/d' 3.txt   //删除包含tom单词的行删除
root
mysql
mysql sad
aaatom
dddd

 

   s:替换  s/old/new/标签     old部分是能够使用正则的,new部分不能使用正则内存

[root@mail ~]# sed 's/tom/TOM/' 3.txt   //只替换第一个tom
root
mysql
mysql sad
aaaTOM
TOM fds tom
dddd
TOM
[root@mail ~]# sed 's/tom/TOM/2' 3.txt   //替换第二个tom
root
mysql
mysql sad
aaatom
tom fds TOM
dddd
tom
[root@mail ~]# sed 's/tom/TOM/g' 3.txt   //替换全部tom
root
mysql
mysql sad
aaaTOM
TOM fds TOM
dddd
TOM
[root@mail ~]# sed -n 's/tom/TOM/g' 3.txt  //关闭默认输出
[root@mail ~]# sed -n 's/tom/TOM/gp' 3.txt   //操做的内容就打印出来
aaaTOM
TOM fds TOM
TOM
[root@mail ~]# sed 's/[t|T][o|O][m|M]/TOM/g' 3.txt   //能够使用[]
root
mysql
mysql sad
aaaTOM TOM
TOM fds TOM
dddd
TOM

  修改配置文件
工作流

[root@mail ~]# sed -n 's/#ServerName www.example.com:80/#ServerName '$aa'/p' /etc/httpd/conf/httpd.conf
#ServerName mail.test.com
[root@mail ~]# sed -n "s/#ServerName www.example.com:80/#ServerName $aa/p" /etc/httpd/conf/httpd.conf
#ServerName mail.test.com
[root@mail ~]# sed -n 's&/sbin/nologin&/bin/bash&gp' passwd    //可将/替换成任意字符
bin:x:1:1:bin:/bin:/bin/bash
daemon:x:2:2:daemon:/sbin:/bin/bash
adm:x:3:4:adm:/var/adm:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/bin/bash
mail:x:8:12:mail:/var/spool/mail:/bin/bash
uucp:x:10:14:uucp:/var/spool/uucp:/bin/bash
[root@mail ~]# sed -n 's</sbin/nologin</bin/bash<gp' passwd
bin:x:1:1:bin:/bin:/bin/bash
daemon:x:2:2:daemon:/sbin:/bin/bash
adm:x:3:4:adm:/var/adm:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/bin/bash
mail:x:8:12:mail:/var/spool/mail:/bin/bash
uucp:x:10:14:uucp:/var/spool/uucp:/bin/bash
[root@mail ~]# sed -n '4{s/aaa/AAA/gp; s/tom/TOM/gp}' 3.txt
AAAtom TOm
AAATOM TOm
//先执行第一条命令再执行第二条命令
[root@mail ~]# sed -n '4{s/aaa/AAA/gp; s/AAA/aaa/gp}' 3.txt
AAAtom TOm
aaatom TOm

&   表示old字符
it

[root@mail ~]# sed 's/tom/--&--/g' 3.txt
root
mysql
mysql sad
aaa--tom-- TOm
--tom-- fds --tom--
dddd
--tom--

\U  把后面全部字符变成大写

[root@mail ~]# sed 's/tom/hhh\Uhhhh/g' 3.txt
root
mysql
mysql sad
aaahhhHHHH TOm
hhhHHHH fds hhhHHHH
dddd
hhhHHHH
[root@mail ~]# cat 4.txt
 [myshare]
        comment = Public Stuff
        path = /home/samba
        public = no
        writable = yes
        browseable = yes
[root@mail ~]# sed -n 's/\[.*\]/\U&/gp' 4.txt   //将[]内的所有变成大写
 [MYSHARE]

\u  把后面第一个字符变成大写

[root@mail ~]# sed 's/tom/hhh\uhhhh/g' 3.txt
root
mysql
mysql sad
aaahhhHhhh TOm
hhhHhhh fds hhhHhhh
dddd
hhhHhhh

\L  把后全部的字符都变成小写的

[root@mail ~]# sed 's/tom/TTT\LTTTT/g' 3.txt
root
mysql
mysql sad
aaaTTTtttt TOm
TTTtttt fds TTTtttt
dddd
TTTtttt

\l  把后面第一个字符变成小写

[root@mail ~]# sed 's/tom/TTT\lTTTT/g' 3.txt
root
mysql
mysql sad
aaaTTTtTTT TOm
TTTtTTT fds TTTtTTT
dddd
TTTtTTT

\E  表明终止

[root@mail ~]# sed 's/tom/ggg\Ugg\Egg/g' 3.txt
root
mysql
mysql sad
aaagggGGgg TOm
gggGGgg fds gggGGgg
dddd
gggGGgg

分组:在old相应的位置使用(),第一个()对应\1,第二个()对应\2

[root@mail ~]# sed -n 's/#\(ServerName\)/\1/p' /etc/httpd/conf/httpd.conf
ServerName www.example.com:80
[root@mail ~]# sed -n 's/\(#\)\(ServerName\)/\2/p' /etc/httpd/conf/httpd.conf
ServerName www.example.com:80


a:在指定行的下一行添加一行

[root@mail ~]# sed '$ a cat cat tom' 3.txt
root
mysql
mysql sad
aaatom TOm
tom fds tom
dddd
tom
cat cat tom
[root@mail ~]# sed '2 a cat cat tom' 3.txt  //指定第二行的下一行
root
mysql
cat cat tom
mysql sad
aaatom TOm
tom fds tom
dddd
tom

i:在指定行的上一行添加一行

[root@mail ~]# sed '2 i cat cat tom' 3.txt
root
cat cat tom
mysql
mysql sad
aaatom TOm
tom fds tom
dddd
tom

c:替换,把知足条件的行替换

[root@mail ~]# sed '/mysql/c apache' 3.txt
root
apache
apache
aaatom TOm
tom fds tom
dddd
tom
[root@mail ~]# sed -n '/^#ServerName/c ServerName '$aa'' /etc/httpd/conf/httpd.conf
ServerName mail.test.com

y:替换,y/abc/XYZ/ 将全部的a、b、c分别换成对应的X、Y、Z

[root@mail ~]# sed  'y/tom/TOM/' 3.txt
rOOT
Mysql
Mysql sad
aaaTOM TOM
TOM fds TOM
dddd
TOM


i:对源文件进行修改,不要使用-n和-p,不然只会输出修改的内容

[root@mail ~]# sed  -i.xx 'y/tom/TOM/' 3.txt   //修改文件同时进行备份成.xx文件
相关文章
相关标签/搜索