sed 的常用选项
选项 说明
-n 使用安静模式,在一般情况所有的 STDIN 都会输出到屏幕上,加入-n 后只打印被 sed 特殊处理的行
-e 多重编辑,且命令顺序会影响结果
-f 指定一个 sed 脚本文件到命令行执行,
-r Sed 使用扩展正则
-i 直接修改文档读取的内容,不在屏幕上输出
Sed 相对于grep擅长替换。
sed -n '5'p test.txt //过滤出第五行 -n 取消默认输出
sed -n '1,5'p test.txt //过滤出指定的1到5行
sed -n '1,$'p test.txt //过滤出1到尾行
sed -n '/root/'p test.txt //过滤出含有root行
sed -nr "/o+t/p" test.txt //-r 和egrep类似的选项。
sed -nr "/root|nologin/p" test.txt //支持和grep一样的选项
sed -nr "/o{2}/p" test.txt
sed -n '/^1/'p test.txt
sed -n 'in$'p test.txt
sed -n '/r..o/'p test.txt
sed -n '/oo*/'p test.txt
sed -e '1'p -e '/111/'p -n test.txt //-e多重编辑。打印第一行和匹配111字符(如果编辑的内容在同一行,一行会被打印两层。说明sed是流式编辑器)
[root@lsx-02 sed]# sed -n -e '1'p -e '/root/'p passwd 不仅打印指定的第一行还要打印出包含字符串root的行
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
[root@lsx-02 sed]# sed -n '/var/'IP passwd 不区分大小写用I
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/Var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
案例:比如一个比较大的日志文件,可能有几个G,日期可能今年年初到现在半年时间了,想前五个月的全删除掉,只留最后一个月的。
1. Vim效率低。
2. 可以使用sed。
首先先确定好多少行。比如上个月的时间(时间戳)日期匹配出来。使用grep -n可以看多少行
sed '1'd test.txt //删除第一行
sed '1,3'd test.txt //删除第一到第三行
sed '/oot/'d test.txt //删除含有oot字符的行
sed '1,2s/ot/to/g' test.txt //把1和2行的ot换成to全局替换
sed 's#ot#to#g' test.txt //把全部ot替换成to
sed -r 's/oo+/aaa/g' test.txt //查找到oo替换成aaa。//前两斜杠之间可以使用正则表达式
sed 's/[0-9]//g' test.txt //删除数字
sed 's/[a-zA-Z]//g' test.txt // //删除英文字符
sed -r 's/(rot)(.*)(bash)/\3\2\1/' test.txt //第一段和最后一段调换位置
sed 's/^.*$/123&/' test.txt=====sed -r 's/(.*)/lsx:&/g' test.txt
sed -i 's/ot/to/g' test.txt //把全部ot字符换成to -i会改变文件内容
sed 's/\/root/lsx/' test.txt //这种情况要么使用替换分隔符#或者at符号
sed 's#lsx#/root#' test.txt
-r 表示不用转义
[root@lsx-02 sed]# cp passwd passwd.bak
[root@lsx-02 sed]# sed -i '1,20'd passwd.bak –i删除原文件内容 可以是数字也可以是一串字符所在的行
[root@lsx-02 sed]# wc -l passwd.bak
7 passwd.bak
[root@lsx-02 sed]# sed '1,10s/root/toor/g' passwd 类似vim替换
[root@lsx-02 sed]# sed -r '1,10s/ro+/r/g' passwd 用特殊字符+ 要加-r
rt:x:0:0:rt:/rt:/bin/bash
bin:x:1:1:bin:/bin:/SBin/nologin
[root@lsx-02 sed]# head -n3 passwd | sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' 头尾调换位置。第一段非冒号的字符一个或者多个:分隔符;第二段.*贪婪匹配到最后一个:;第三段非冒号的一个或者多个。一个小括号就是一个部分。
/bin/bash:x:0:0:root:/root:root
/SBin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon
[root@lsx-02 sed]# head passwd |sed 's/[a-zA-Z]//g' //删除英文字符
::0:0::/://
::1:1::/://
::2:2::/://
sed -r 's/(.*)/lsx:&/g' test.txt
[root@lsx-02 sed]# head passwd | sed -r 's/(.*)/aaa:\1/' 在行的前面加aaa:()对应1 \1可以用&代替
aaa:root:x:0:0:root:/root:/bin/bash
aaa:bin:x:1:1:bin:/bin:/SBin/nologin
aaa:daemon:x:2:2:daemon:/sbin:/sbin/nologin