Linux sed 简单操作
一、sed简介
sed是一种在线的编译器,它一次处理一行内容,将内容存储在临时的缓冲区中,接着用sed命令处理缓冲区的内容,处理完后将缓冲区的内容送往屏幕。(默认不更改原文件内容,除非使用重定向存储输出)
二、sed使用参数
格式:[root@www ~]# sed [-nefr] [动作]
选项与参数:
-n :使用安静(silent)模式。取消默认原有输出,只显示特殊处理的内容。
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。
动作说明: [n1[,n2]]function
n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』
function:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
############################sed练习##################################
sed练习案例
1、将/etc/passwd的内容以行号列出来,并将2-35行内容删除
[root@localhost ~]# nl /etc/passwd | sed '2,35d'
![](https://images2015.cnblogs.com/blog/974790/201704/974790-20170409221533175-1992772315.png)
注意:原文件内容并没有删除,只是显示的时候删除了2-35行内容
2、在第二行后面添加 "I am studing linux"[在第三行显示]
[root@localhost ~]# nl /etc/passwd | sed '2a I am studing linux'
a (add)新增一行, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
![](https://images2015.cnblogs.com/blog/974790/201704/974790-20170409221626644-199152461.png)
注意:如果添加多行,则需要在命令的结尾打上\,然后按住ctrl+回车 换行输入
[root@localhost ~]# nl /etc/passwd | sed '2a I am studing linux\
drink beer?'
![](https://images2015.cnblogs.com/blog/974790/201704/974790-20170409221701003-513932485.png)
3、以行单位替换显示:将2-35行的内容替换成“NO number 2-35”显示
[root@localhost ~]# nl /etc/passwd | sed '2,35c NO number 2-35'
c (change),替换显示
![](https://images2015.cnblogs.com/blog/974790/201704/974790-20170409221714050-1813545787.png)
4、寻找数据并显示 从/etc/passwd文件中查找出root,并只显示root所在行
[root@localhost ~]# nl /etc/passwd | sed -n '/root/p'
![](https://images2015.cnblogs.com/blog/974790/201704/974790-20170409221727628-376440726.png)
5、数据搜索并执行命令
搜索/etc/passwd,找到root对应的行,把bash替换为blueshell,再输出这行 。【执行后面花括号中的一组命令,每个命令之间用分号隔开】
[root@localhost ~]# nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p}'
![](https://images2015.cnblogs.com/blog/974790/201704/974790-20170409221739425-1192649361.png)
如果只替换第一个关键字就退出可在后面添加;q
![](https://images2015.cnblogs.com/blog/974790/201704/974790-20170409221806738-733303109.png)
6、数据搜索替换
格式:sed ‘s#XXX#MMM#g’ 文件
[root@localhost ~]# sed -n 's#oldboy#network#gp' test.txt
![](https://images2015.cnblogs.com/blog/974790/201704/974790-20170409221825941-1345201251.png)
sed -r 's#(.*) cisco#\1#g' test.txt
-r 代表进行正则表达式批评
(.*) cisco 代表任意内容并以cisco结尾的关键字
\1 取出正则表达式中第一个()里面代表的内容
![](https://images2015.cnblogs.com/blog/974790/201704/974790-20170409221837144-685018792.png)
7.只查看wen.txt文件(100行)内的第20-30行
① sed -n '20,30p' wen.txt ----最简单快捷的方式
![](https://images2015.cnblogs.com/blog/974790/201704/974790-20170409222221097-371653945.png)
②head -30 wen.txt|tail -11 ----效率最低,尽量不用
head -n 取出文件的前n行,默认是前10行,例如取前3行则是 head -3
tail -n 取出文件的后n 行,默认是后10行,例如取出后11行,则是 tail -11
【tail -f 文件名 】可以跟踪文件尾部的变化,tail -f 可以简写为tailf
③ awk '{if(NR>19&&NR<31) printf $1"\n"}' wen.txt
awk '{if(NR>19&&NR<31) print $1}' wen.txt
![](https://images2015.cnblogs.com/blog/974790/201704/974790-20170409222347191-133418046.png)
注意:如果采用关键字printf则默认情况下是没有换行的,必须在后面加“\n”,如果是采用print,则默认情况下是有换行,无需加“\n”