1,linux 三剑客之老一 sed

Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。


	-e :直接在命令行模式上进行sed动作编辑,此为默认选项;
	-i :直接修改文件内容;
	-n :只打印模式匹配的行;取消默认输出
	-r :在脚本指令中使用扩展正则表达式


	

	-n选项和p命令一起使用表示只打印那些发生替换的行:
	sed -n 's/test/TEST/p' file

	过滤某一个时间段的日志:
	sed -n '/2017-5-18 9:51:13/,/2017-5-18 9:55:13/p' test1.log
	
	
	基础正则表达式:一些特殊的符号:
	. 单个任意字符
	* 重复前面任意0个或多个字符
	.* 匹配任意字符


-r  自动会反斜线转义,所以在需要转义的时候,就不需要加反斜杠。
[root@centos7 ~]# cat aa.txt 
111
222
333
444
555
[root@centos7 ~]# 
[root@centos7 ~]# sed -r 's#(.*)#\1 on#g' aa.txt 
111 on
222 on
333 on
444 on
555 on
[root@centos7 ~]# 
  \1  代表的是输出第一个括号匹配的内容
  \2  代表的是输出第二个括号匹配的内容


[root@node1 ~]# echo oldboy >test.txt
[root@node1 ~]# sed 's#(.*)# I am \1#g' test.txt 
sed: -e expression #1, char 17: invalid reference \1 on `s' command's RHS
[root@node1 ~]# sed 's#\(.*\)# I am \1#g' test.txt 
 I am oldboy
[root@node1 ~]# sed 's#(.*)# I am \1#g' test.txt 
sed: -e expression #1, char 17: invalid reference \1 on `s' command's RHS
[root@node1 ~]# sed -r 's#(.*)# I am \1#g' test.txt 
 I am oldboy
[root@node1 ~]#


[root@node1 ~]# cat test.txt 
oldboy fff
2oldboy fff
3oldboy fff
[root@node1 ~]# sed -r 's#(.*) (.*)#\1#g' test.txt 
oldboy
2oldboy
3oldboy
[root@node1 ~]# sed -r 's#(.*) (.*)#\2#g' test.txt 
fff
fff
fff
[root@node1 ~]# sed -r 's#(.*) (.*)#\1\2#g' test.txt 
oldboyfff
2oldboyfff
3oldboyfff
[root@node1 ~]# sed -r 's#(.*) (.*)#\1 \2#g' test.txt 
oldboy fff
2oldboy fff
3oldboy fff
[root@node1 ~]#


[root@node1 ~]# cat -n a.txt 
     1    aa 11
     2    bb 22
     3    cc 33 
     4    dd 44
     5    ee 55
     6    ff 66 
     7    gg 77
[root@node1 ~]# awk '{if(NR<5 && NR>1) print $1}' a.txt
bb
cc
dd

[root@node1 ~]# awk '{print $1}' a.txt
aa
bb
cc
dd
ee
ff
gg
[root@node1 ~]# awk -F “ ” '{print $1}' a.txt
aa
bb
cc
dd
ee
ff
gg
[root@node1 ~]#
[root@node1 ~]# awk -F " " '{print $1 $2}' a.txt
aa11
bb22
cc33
dd44
ee55
ff66
gg77
[root@node1 ~]#


Sed 单行增加:
	2a 在第二行后面增加。
	2i 在第二行的前面插入。
[root@node1 ~]# cat a.txt
111
222
333
444
555
[root@node1 ~]# sed '2a aaa,bb,cc,dd' a.txt 
111
222
aaa,bb,cc,dd
333
444
555
[root@node1 ~]# sed -i '2a aaa,bb,cc,dd' a.txt 
[root@node1 ~]# cat a.txt
111
222
aaa,bb,cc,dd
333
444
555
[root@node1 ~]# sed -i '2i aaa,bb,cc,dd' a.txt 
[root@node1 ~]# cat a.txt
111
aaa,bb,cc,dd
222
aaa,bb,cc,dd
333
444
555
[root@node1 ~]#


Sed  多行增加:
    \n     换行
[root@node1 ~]# cat a.txt 
111
222
333
444
555
[root@node1 ~]# sed '2a aa,bb,cc,dd\nee,ff,gg' a.txt 
111
222
aa,bb,cc,dd
ee,ff,gg
333
444
555
[root@node1 ~]#


Sed 删除
        ‘2d’  删除第二行
        ‘2, 5d’ 删除2到5行
	‘1~2d’ 删除奇数行
	‘2~2d’ 删除偶数行
[root@node1 ~]# cat a.txt
111
222
a,bb,cc,dd
ee,ff,gg
333
444
555
[root@node1 ~]# 
[root@node1 ~]# 
[root@node1 ~]# sed -i '3d' a.txt 
[root@node1 ~]# cat a.txt
111
222
ee,ff,gg
333
444
555
[root@node1 ~]#
[root@node1 ~]# sed -i '1,3d' a.txt 
[root@node1 ~]# cat a.txt
333
444
555
[root@node1 ~]#

[root@node1 ~]# cat -n a.txt
     1    aa
     2    bb
     3    cc
     4    dd
     5    ee
     6    ff
     7    gg
     8    hh 
[root@node1 ~]# sed -i '1~2d' a.txt
[root@node1 ~]# cat -n a.txt 
     1    bb
     2    dd
     3    ff
     4    hh
[root@node1 ~]#


匹配所有bb 与ff 之间的行
[root@node1 ~]# cat a.txt
aa
bb
cc
dd
ee
ff
gg
hh
[root@node1 ~]# sed -n '/bb/,/ff/p'  a.txt
bb
cc
dd
ee
ff
[root@node1 ~]#


打印第几行的内容
[root@node1 ~]# cat -n a.txt
     1    aa
     2    bb
     3    cc
     4    dd
     5    ee
     6    ff
     7    gg
[root@node1 ~]# sed -n '1,2p' a.txt
aa
bb
[root@node1 ~]#


3c 替换第几行的内容
[root@node1 ~]# cat a.txt
aa
bb
cc
dd
ee
ff
gg
[root@node1 ~]# 
[root@node1 ~]# sed '3c ccccccccccccccccc' a.txt
aa
bb
ccccccccccccccccc
dd
ee
ff
gg
[root@node1 ~]#




例如: sed -n 2~5p 含义:从第二行开始匹配,隔 5 行匹配一次,即 2,7,12.......。

-n:取消默认输出
[root@centos7 ~]# cat aa.txt 
111
222
333
444
555
[root@centos7 ~]# 
[root@centos7 ~]# sed '/22/p'  aa.txt 
111
222
222
333
444
555
[root@centos7 ~]# sed -n '/22/p'  aa.txt 
222
[root@centos7 ~]# 


删除第三行
[root@centos7 ~]# cat -n aa.txt 
     1	111
     2	222
     3	333
     4	444
     5	555
[root@centos7 ~]# sed '3d' aa.txt 
111
222
444
555
[root@centos7 ~]# 


sed '3,$d' aa.txt
删除从第三行到最后一行内容,剩余各行被打印。
[root@centos7 ~]# cat -n aa.txt 
     1	111
     2	222
     3	333
     4	444
     5	555
[root@centos7 ~]# 
[root@centos7 ~]# 
[root@centos7 ~]# sed '3,$d' aa.txt
111
222
[root@centos7 ~]#


替换一行或多行
sed '1c Hi' aa.txt   第一行替换为HI
sed '1,2c Hi' aa.txt 第一行到第二行替换为HI
[root@centos7 ~]# cat aa.txt 
111
222
333
444
555
[root@centos7 ~]# 
[root@centos7 ~]# 
[root@centos7 ~]# sed '1c Hi' aa.txt
Hi
222
333
444
555
[root@centos7 ~]#


多点编辑:e命令
	-e选项允许在同一行里执行多条命令:
	sed -e '1,5d' -e 's/test/check/g' file
	上面sed表达式的第一条命令删除1至5行,第二条命令用check替换test。

 

posted @ 2020-10-13 18:13  pwcc  阅读(208)  评论(0)    收藏  举报