sed工具
grep只能查找功能,不能把查找的内容替换. sed可以
sed的命令格式: sed [option] 'sed command'filename
sed命令的选项(option):
-
-n :只打印模式匹配的行
-
-e :直接在命令行模式上进行sed动作编辑,此为默认选项
-
-f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作
-
-r :支持扩展表达式
-
-i :直接修改文件内容
打印指定行
sed -n 'n'p filename
单引号中n是数字,表示第几行; -n选项是只显示我们要打印的行, 不加会把所有行打印出来
sed -n 'n1,n2'p filename //打印n1行 至 n2行之间的
sed -n 'n1,$'p filename //n1 至末尾行; $表示末尾行
打印包含某个字符串的行
sed -n '/字符串/'p filename
sed -e '数字n'p -e '/字符串/'p -n filename
[root@lz-01 sed]# sed -e '1'p -e '/root/'p -n test.txt
root:x:0:0:root:/root:/bin/bash //第一个-e表达式效果
root:x:0:0:root:/root:/bin/bash //第二个-e表达式效果
operator:x:11:0:operator:/root:/sbin/nologin
sed命令加上-e选项可以实现多个行为; 多个-e选项后边表达式结果互不影响
[root@lz-01 sed]# sed -n '/o\+t/'p test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@lz-01 sed]# sed -nr '/o+t/'p test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
对于字符串中含有需要转移的字符, 如果不转义需要加-r选项; 等同于grep -E
sed -n '/root/'Ip test.txt
p前加I可以不区分大小写
删除某些行
sed '1,20'd test.txt // 把显示结果的1~20行删除,不改变原文件内容
sed -i '1,20'd test.txt //加上-i选项会操作源文件删除后显示
sed '/root/'d test.txt //删除匹配root字符串的行
替换字符或字符串
sed '1,10s/ot/to/g' test.txt // ot替换为to
参数s表示替换动作, g表示1,10行全局替换. 不加g只替换本行出现的第一个; 分隔符/可以使用其他字符如#和@
sed 's/\<bin\>/& test/g' test.txt
单词牟定 <bin> bin这个单词
调换两个字符位置
[root@lz-01 sed]# head test.txt |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
1111111111111111
/sbin/nologin:x:3:4:adm:/var/adm:adm
/sbin/nologin:x:4:7:lp:/var/spool/lpd:lp
/bin/sync:x:5:0:sync:/sbin:sync
/sbin/shutdown:x:6:0:shutdown:/sbin:shutdown
/sbin/halt:x:7:0:halt:/sbin:halt
/sbin/nologin:x:8:12:mail:/var/spool/mail:mail
[root@lz-01 sed]#
上例中用()把想要替换的字符打包一个整体, 即分组. 后边\1 \2 \3引用前面的组. ()括号需要转义; -r可以省略转义; 扩展表达式
直接修改文件内容
sed -i 's/ot/to/g' test.txt
-i选项直接修改文件内容.