sed的使用案例
使用sed操作/etc/passwd,最好复制一份(cp /etc/passwd /tmp),操作tmp下的passwd(其实不用,因为在一般情况下sed只是修改了输出结果,不会改变文件本身,除非要求这么做).
以行为单位的新增/删除
要求:将/etc/passwd的内容列出并且列印行号,同时删除2~5行.
做法:cat /etc/passwd | sed ‘2,5d’
sed的动作是’2,5d’(动作需要放在单引号之间)
nl命令在linux系统中用来计算文件中行号。nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等等的功能。
只删除第二行:
nl /etc/passwd | sed ‘2d’
删除第3行到最后一行
cat -n /etc/passwd | sed ‘3,$d’
在第二行后(就是在第三行)加上”i am fine”字样
cat -n /etc/passwd | sed ‘2a i am fine’
如果要在第二行前面
nl /etc/passwd | sed ‘2i i am fine’
如果是要增加两行以上,在第二行后面加入两行字,例如『hello』与『how are you』
nl /etc/passwd | sed ‘2a hello\
>how are you’
每一行之间都必须要以反斜杠(\)来进行新行的添加,所以上面的例子,我们可以发现在第一行的最后面就有 \ 存在。
(再输入的是会需要注意,单引号不要一起输完).
以行为单位的替换与现实
将第2-5行的内容替换成”hahaha”
nl /etc/passwd | sed ‘2,5c hahaha’
通过这个方法,我们就可以替换整行数据了.
仅列出/etc/passwd文件的5-7行
cat -n /etc/passwd | sed -n ‘5,7p’
可以透过这个 sed 的以行为单位的显示功能, 就能够将某一个文件内的某些行号选择出来显示。
数据的搜寻与显示
搜索/etc/passwd中有关/root关键字的行
nl /etc/passwd | sed ‘/root/p’
思考:为什么会输出所有行的情况?
使用-n的时候将只打印包含模板的行。
nl /etc/passwd | sed -n ‘/root/p’
数据的搜索与删除
删除/etc/passwd所有包含root的行,其他行输出
nl /etc/passwd | sed ‘/root/d’
数据的搜索并执行命令
搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把bash替换为blueshell,再输出这行:
nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p}'
如果只替换/etc/passwd的第一个bash关键字为blueshell,就退出
nl /etc/passwd | sed -n '/bash/{s/bash/blueshell/;p;q}' 1
最后的q是退出。
数据的搜索并替换
除了整行的处理模式之外,sed还可以用行为单位进行部分数据的搜寻并替换.基本上sed的搜寻与替换与vi相当的类似.
sed ‘s/要被取代的字符串/新的字符串/g’
先通过/sbin/ifconfig eth0查看本机的IP地址,我的是(192.168.199.5)
将IP前面部分予以删除
/sbin/ifconfig eth0 | grep 'inet addr'|sed 's/^.*addr://g'
将IP后面部分予以删除
/sbin/ifconfig eth0 | grep 'inet addr'|sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
即可得到IP
多点编辑
一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换成hahaha.
nl /etc/passwd | sed -e ‘3,$d’ -e ‘s/bash/hahaha/g’
注意:每天命令前面都加入了-e选项
直接修改文件内容
最好别使用,如果使用需要加入一个-i选项
例如在最后一行插入hahaha
nl /etc/passwd | sed -i ‘$i hahaha’