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。