linuc-sed

sed

3.1 简介:

sed是一个流编辑器,非交互式的编辑器,他一次处理一行内容
处理时,把当前处理的行存储在临时缓冲区时,成为“模式空间”,接着用sed命令缓冲区的内容,处理完,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,知道文件末尾。

3.2 功能:

过滤 擅长增加、删除、修改、查询

3.3 格式:

sed 条件 命令(找谁 做什么)

3.4 sed参数:

-a	-----在下一行添加内容
-c	-----在第几行重定向内容
-i 	-----修改文件内容
-r	-----支持扩展正则
-n	-----取消默认输出
-d	-----删除delete,删除·……的行
-p	-----打印
&	-----表示前面匹配到的内容
-e	-----允许多项编辑
!	-----对所选行以外的所有行应用命令
h 	-----把模式空间里的内容追加到暂存缓冲区
H	-----把模式空间里的内容追加到暂存缓冲区
g	-----取出暂存缓冲区的内容,将其复制到模式空间,覆盖该处原有内容
G	-----取出暂存缓冲区的内容,将其复制到模式空间,追加在原有内容后面
n	-----获取下一行命令
w	-----将匹配到的行写入到新文件中,会覆盖原来的内容,重定向到新的文件中
N 	-----追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
~	-----间隔的意思
p	-----行 取行的参数
/c: 将匹配的内容行, 进行替换

3.4.1 sed参数示例

取行  p:行,取行需要加的参数
	取行
		sed -n '3p' id.txt		取第吖行的内容
	多行  
		  sed -n '3,5p' id.txt (3至5行)
		  sed -n '3p;5p' id.txt(第三行和第五行)
		  sed -n '1~2p' sed.txt (从第1行开始,每次加2)		
		  sed -n '$p'(查找最后一行)


查找内容
    	 sed -n '/o/p' id.txt  查找包含内容o的行
		 sed -n '/a/,/c/p' 12.txt :查找包含内容a,到包含内容b的行

追加内容  参数:a  参数r:支持扩展正则 \n:表示回车
		sed -r '2a 123' sed.txt (在第2行下面追加123) 不修改文件内容,只修改输出的内容
		sed -ri '2a qweasd' 12.txt 在第2行下面追加123) 修改文件内容,只修改输出的内容
       sed -r '2a 123\n456\n789' sed.txt ;sed命令追加多行,用\n隔开,\n表示回车键
			增加多行:用cat比较方便,有变量时加‘’可以取消变量
		[root@shells ~]# echo {a..z} |sed  's#[a-z]#<&>#g'		在每个字母中间添加<> 符号
			<a> <b> <c> <d> <e> <f> <g> <h> <i> <j> <k> <l> <m> <n> <o> <p> <q> <r> <s> <t> <u> <v> <w> <x> <y> <z>

正则匹配对应内容, 然后进行替换   /c: 将匹配的内容行, 进行替换
		sed -i '/^SELINUX=/c SELINUX=Disabled' /etc/selinux/config
		
在文件的第四行上面添加内容  i:在..上一行
		sed -i '4i listen 80;' 02.txt
		
//查找匹配到的行, 在匹配的行后面添加内容
		[root@Shell ~]# sed -r 's/[0-9][0-9]$/& .5/' passwd


给文件行添加注释

格式: sed /原内容/替换后的内容/
//将第二行到第六行加上注释信息
[root@Shell ~]# sed '2,6s/^/#/' passwd

//将第二行到第六行最前面添加#注释符
[root@Shell ~]# sed -r '2,6s/.*/#&/' passwd

//添加#注释符  ^:以...开头的行  #: 前一个字连续出现0次或0次以上
[root@Shell ~]# sed -r '3,$ s/^#*/#/' passwd	#将第三行到最后一行,每一行开头前添加'#'
sed -r '30,50s/^[ \t]*#*/#/' /etc/nginx.conf #将30~50行的内容以空格,tab或者# 开头的行, 都替换为单个'#'

sed -r '2,8s/^[ \t#]*/#/' /etc/nginx.conf	#将2~8行以空格 tab键或者更井号开头的行替换为#.

//替换匹配root行的下一列;
		[root@Shell ~]# sed '/root/{n; s/bin/test/}' passwd

//非交互式修改指定的配置文件  -r:支持扩展正则  -i:修改文件内容
格式: sed '/源内容/c修改后的内容'

[root@Shell ~]# sed -ri '/UseDNS/cUseDNS no' /etc/ssh/sshd_config
[root@Shell ~]# sed -ri '/GSSAPIAuthentication/c#GSSAPIAuthentication no' /etc/ssh/sshd_config
[root@Shell ~]# sed -ri '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config

删除

-r:支持扩展正则 d:删除..行 -i:修改文件内容
格式:
sed /内容匹配/d 文件路径
sed '多少行d' 文件内容

删除包含oldboy或yy的行,不修改源文件,加-i修改源文件
		sed -r '/oldboy|yy/d' soldboy.txt
//从第三行开始删除到最后一行内容,不修改源文件,加-i修改源文
		[root@Shell ~]# sed '3,$d' passwd
//删除第三行和最后一行的内容,不修改源文件,加-i修改源文件
		[root@Shell ~]# sed '3d;$d' d.txt
//删除最后一行,不修改源文件,加-i修改源文
		[root@Shell ~]# sed '$d' passwd
//删除所有的行,不修改源文件,加-i修改源文
		[root@Shell ~]# sed '1,$d' passwd
//匹配正则进行该行删除,删除包含mail的所有行,不修改源文件,加-i修改源文件
		[root@Shell ~]# sed /mail/d passwd
//匹配root的行, 删除所有root行的下一列,不修改源文件,加-i修改源文件 n:获取文件下一行
		[root@Shell ~]# sed '/root/{n;d}' passwd
//除了第三行,其他全部删除,不修改源文件,加-i修改源文件 !:不的意思,取反
		[root@Shell ~]# sed -r '3!d' /etc/hosts

删除文件   ^:以...开头的行 \t:tab键  $:结尾

//删除配置文件中#号开头的注释行, 如果碰到tab或空格是无法删除的,不修改源文件
		[root@Shell ~]# sed '/^#/d' file
//删除配置文件中以#开头的行,如果井号前面是空格或者tab键则也删除,不修改源文件.
		[root@Shell ~]# sed -r '/^[ \t]*#/d' file
//删除无内容的空行,不修改源文件,只修改输出内容.
		[root@Shell ~]# sed -r '/^[ \t]*$/d' file
						egrep -v "^$| $"  file.txt
//删除注释行及空行
		[root@Shell ~]# sed -r '/^[ \t]*#/d; /^[ \t]*$/d' /etc/vsftpd/vsftpd.conf
		[root@Shell ~]# sed -r '/^[ \t]*#|^[ \t]*$/d' /etc/vsftpd/vsftpd.conf
		[root@Shell ~]# sed -r '/^[ \t]*($|#)/d' /etc/vsftpd/vsftpd.conf

替换	‘s###g’		s:替换命令标志	###:为标识符,可以为任何3三个相同符号,比如:///	g:行内全局替换	
	格式
//将123替换为abc),不修改源文件,加-i修改源文件
		sed -r 's#123#abc#g’ 	+文件名称
		sed 's#123#000#'		(不加g,sed默认替换每一行第一个匹配的内容)
		
//调换第一列与最后一列的内容
			sed -r 's#(^.*)(:.*:)(/.*$)#\3\2\1#g' /etc/passwd   #\3代表1~2井号之间第三个括号里面的内容, \2表示第二个括号的内容,\1表示第一个括号的内容
		
//替换每行出现的第一个root为Alice
		[root@Shell ~]# sed 's/root/alice/' passwd
		
//替换以root开头的行
		[root@Shell ~]# sed 's/^root/alice/' passwd
		
//查找匹配到的行, 在匹配的行后面添加内容
		[root@Shell ~]# sed -r 's/[0-9][0-9]$/&.5/' passwd
		
//匹配包含有root的行进行替换,忽略大小写
		# sed -r 's/root/alice/gi' /etc/passwd

w 将匹配到的行写入到新文件中, 重定向到新文件中

//将paswd匹配的行写入到newfile文件中
[root@Shell ~]# sed -n '/root/w newfile' passwd

//将passwd文件的第二行写入到newfile中
[root@Shell ~]# sed -n '2w newfile' passwd

n 获取下一行命令

//匹配root的行, 删除root行的下一列
[root@Shell ~]# sed '/root/{n;d}' passwd
//替换匹配root行的下一列
[root@Shell ~]# sed '/root/{n; s/bin/test/}' passwd

暂存和取用命令h H g G

h -----把模式空间里的内容追加到暂存缓冲区
H -----把模式空间里的内容追加到暂存缓冲区
g -----取出暂存缓冲区的内容,将其复制到模式空间,覆盖该处原有内容
G -----取出暂存缓冲区的内容,将其复制到模式空间,追加在原有内容后面

//将第一行的写入到暂存区, 替换最后一行的内容
		[root@Shell ~]# sed  '1h;$g' /etc/hosts

//将第一行的写入到暂存区, 在最后一行调用暂存区的内容
		[root@Shell ~]# sed  '1h;$G' /etc/hosts

//将第一行的内容删除但保留至暂存区, 在最后一行调用暂存区内容追加至于尾部
		[root@Shell ~]# sed -r '1{h;d};$G' /etc/hosts

//将第一行的内容写入至暂存区, 从第二行开始进行重定向替换
		[root@Shell ~]# sed -r '1h;2,$g' /etc/hosts

//将第一行重定向至暂存区, 2-3行追加至暂存区, 最后追加调用暂存区的内容
		[root@Shell ~]# sed -r '1h; 2,3H; $G' /etc/hosts

//将文件所有的回车替换为空格
[root@web01 ~]# sed ':label;N;s#\n# #g;t label' test.txt 
1 2 3 4 5 6 7 8 9 10

先删除行,然后给管道后面的sed进行替换

-e 允许多项编辑

//先删除一到9行内容,再将root替换为Alex,不修改源文件
[root@Shell ~]# sed -e '1,9d' -e 's#root#alex#g' passwd

后项引用

echo {a..z}|sed 's#.#<&>#g'

命令行变量

//将变量xx的内容替换为变量oo的内容,这里要使用双引号,双引号具有执行功能
[root@shells ~]# xx=oldboy
[root@shells ~]# oo=oldgirl
[root@shells ~]# sed "s#$xx#$oo#g" /oldboy/oldboy.txt
baabbbccccddddeeeefffff
oldgirl

练习

利用sed命令将test.txt中所有的回车替换成空格?

方法1 
把每一行内容追加到Hold Space中,最后1行弄回到Pattern space中.然后进行替换

[root@oldboyedu-show01 ~]# seq 10 |sed -n 'H;$x;s#\n# #gp'
 1 2 3 4 5 6 7 8 9 10

[root@oldboyedu-show01 ~]# seq 10 |sed -n '1h;1!H;$x;s#\n# #gp'
1 2 3 4 5 6 7 8 9 10

[root@oldboyedu-show01 ~]# seq 10 |sed -n 'H;$x;s#\n# #gp'
 1 2 3 4 5 6 7 8 9 10

[root@oldboyedu-show01 ~]# seq 10 |sed -n 'H;${x;s#\n# #gp}'
 1 2 3 4 5 6 7 8 9 10

[root@oldboyedu-show01 ~]# seq 10 |sed -n '1h;1!H;$x;s#\n# #gp'
1 2 3 4 5 6 7 8 9 10

[root@oldboyedu-show01 ~]# seq 10 |sed -n '1h;1!H;${x;s#\n# #gp}'
1 2 3 4 5 6 7 8 9 10



方法2 sed命令的“循环(标签)”方法
[root@oldboyedu-show01 ~]# seq 10 |sed ':label ;N;s#\n# #g;t label'
1 2 3 4 5 6 7 8 9 10

方法3 tr
如果不用sed直接用tr即可
[root@oldboyedu-show01 ~]# seq 10 |tr "\n" " "
1 2 3 4 5 6 7 8 9 10

方法4 awk 修改ORS
ORS是Output Record Separator 输出分隔符,用来指定awk在显示每一行的时候每一行的结尾是什么默认是回车这里改成了空格。正好符合题意,把回车替换成空格.

[root@oldboyedu-show01 ~]# seq 10 |awk -vORS=" " '1'
1 2 3 4 5 6 7 8 9 10 [root@oldboyedu-show01 ~]#

[root@oldboyedu-show01 ~]# seq 10 |awk -vORS=" " '{print $0}'
1 2 3 4 5 6 7 8 9 10 [root@oldboyedu-show01 ~]#



posted @ 2024-06-14 17:55  帅帅啊  阅读(48)  评论(0)    收藏  举报