sed

 

(grep)正则表达式

linux三剑客之grep(筛选)
	-i : 忽略大小写
	-n : 显示过滤出来的文本在文件内的行号
	-o : 仅显示过滤出来的文本
	-q : 静默输出
	-v : 反向输出
	-E :使用扩展正则表达式
	-l : 显示文件路径
	-R :递归查询文件内内容
	-c : 显示匹配出来的个数
	-w :精确匹配 
	
	-A : 显示文件之后的行
	-B :显示文件之前的行
	-C :显示文件之前后的行

2、正则表达式

	1、普通正则
	
		* 	:匹配零个或多个前导字符
		.   : 匹配一个任意字符
		.*  : 匹配零个或多个任意字符
		[]  : 或者
		^   : 以某某开头
		$   : 以某某结尾
		[^] : 取反
		\   : 转义字符
	
	2、扩展正则
	
		+  : 匹配至少一个前导字符
		?  : 匹配零个或一个字符
		() : 分组
		{} :范围
			{m,n}	: m 到 n
			{m}		: m个
			{m,}	:至少m个
		|  :或者
		^$ :空格

	练习1:将/etc/fstab文件中所有的注释行和空行过滤掉
		[root@localhost ~]# egrep -v  " *#|^$" /etc/fstab 
		 空格*#:零个或多个空格然后跟个#号
          ^$:  以空格开头的行

linux三剑客之sed

linux三剑客之sed:sed(流式编辑器) : sed主要用来修改文件。 
	1、sed命令
		sed [参数] "[定位][指令]" 处理的文本路径
		
			注:不指定定位,则默认处理全文。
	
		指令:
			
			p : 打印文本
			d : 删除文本
	
		参数:
		
			-e : 允许多项编辑
			-n : 取消默认输出  不输出原文件,只输出修改的
			-i : 就地编辑文本   不加-i不会实际删
			-r : 支持扩展正则表达式(sed中的正则表达式必须放在两个//中间)
			-f :指定定位规则的文件  正则表达式写在文件里,指定这个文件
			
		案例:
		
			1、在文本中,打印第一行和第五行
				[root@localhost ~]# sed -e '5p' -e "1p" 1.txt 
                    我是第1行
                    我是第1行
                    我是第2行
                    我是第3行
                    我是第4行
                    我是第5行
                    我是第5行
                    我是第6行
                    我是第7行
                    我是第8行
                    我是第9行
                    我是第10行
			2、在文本中,要求只打印第1,5,6三行
				[root@localhost tmp]# sed -n -e "1p" -e "5p" -e "6p" 1.txt 
                    我是第1行
                    我是第5行
                    我是第6行

			3、要求删除文件的第3行
				[root@localhost tmp]# sed -i "3d" 1.txt 
				[root@localhost tmp]# cat 1.txt 
                    我是第1行
                    我是第2行
                    我是第4行
                    我是第5行
                    我是第6行
                    我是第7行
                    我是第8行
                    我是第9行
                    我是第10行
			
			4、删除/etc/fstab文件中所有的注释的行
				[root@localhost tmp]# sed -r "/^ *#|^$/d" 2.txt 
        /dev/mapper/centos-root /                       xfs     defaults        0 0
        UUID=bda5d4f6-f6af-448a-bd08-45997f1288c7 /boot                   xfs     defaults        0 0
        /dev/mapper/centos-swap swap                    swap    defaults        0 0
        /dev/sdb1 /mnt xfs defaults 0  0
				
			5、删除1.txt的3行,打印第4行
				[root@localhost tmp]# cat 3.txt 
                    3d
                    4p
				[root@localhost tmp]# sed -f 3.txt 1.txt 
                    我是第1行
                    我是第2行
                    我是第4行
                    我是第4行
                    我是第5行
                    我是第6行
                    我是第7行
                    我是第8行
                    我是第9行
                    我是第10行

		练习1:要求将/etc/passwd文件复制到/root/4.txt中,然后删除当中含/sbin/nologin的行
											正则表达式必须/写在这里/,里面\加上转义字符
			[root@localhost tmp]# sed -i  -r "/\/sbin\/nologin/d" 4.txt 
			[root@localhost tmp]# cat 4.txt 
                root:x:0:0:root:/root:/bin/bash
                sync:x:5:0:sync:/sbin:/bin/sync
                shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
                halt:x:7:0:halt:/sbin:/sbin/halt
                test:x:1000:1000::/home/test:/bin/bash
                gailun:x:111:222::/home/gailun:/bin/bash
                test:x:996:995::/home/test:/bin/bash
                test666:x:124:123:手动创建用户:/home/test666:/bin/bash
                test111:x:1001:1001::/home/test111:/bin/bash
				
		练习2:将/etc/nginx/nginx.conf文件中所有的注释的行(以#开头的行)全部删除
			[root@localhost tmp]# sed -r "/^ *#/d" /etc/nginx/nginx.conf
									^ *# :零个空格或多个空格开头然后跟个#号的行删除
		

sed + 正则表达式(定位)

sed + 正则表达式(定位)
		1、数字定位
		
			1、固定定位   打印第二行
				[root@localhost ~]# sed -n '2p' 1.txt 
			
			2、范围定位    "1,3p" 1-3行打印
				[root@localhost ~]# sed -n '1,3p' 1.txt 
		
		2、正则定位
		
			正则表达式必须放在/ / 之间
			
			1、打印/etc/passwd文件中包含root的行
				[root@localhost tmp]# sed -n -r  "/root/p" /etc/passwd
                    root:x:0:0:root:/root:/bin/bash
                    operator:x:11:0:operator:/root:/sbin/nologin


			2、将包含空格的行打印出来
				[root@localhost tmp]# 
                    [root@localhost tmp]# sed -n -r "/ +/p" /etc/passwd
                    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
                    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
                    dbus:x:81:81:System message bus:/:/sbin/nologin
                    polkitd:x:999:998:User for polkitd:/:/sbin/nologin
                    tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
                    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
                    nginx:x:998:996:Nginx web server:/var/lib/nginx:/sbin/nologin
		3、数字加正则
			
			正则匹配是非贪婪性的匹配
			
				贪婪性是匹配到了之后,不停继续匹配,直至文件所有的内容全部匹配完毕
				
				非贪婪性匹配,一旦匹配到了就停止匹配
		
			1、在/etc/passwd文件中的第一行,到包含test的行,全部删除,删除第一行到 有test的行 
				[root@localhost tmp]# sed -r "1,/test/d" /etc/passwd 
                    nginx:x:998:996:Nginx web server:/var/lib/nginx:/sbin/nologin
                    gailun:x:111:222::/home/gailun:/bin/bash
                    test:x:996:995::/home/test:/bin/bash
                    test666:x:124:123:手动创建用户:/home/test666:/bin/bash
                    test111:x:1001:1001::/home/test111:/bin/bash

			2、删除从包含root的行到第5行的内容
				[root@localhost tmp]# sed -r "/root/,5d" /etc/passwd

			3、从包含root的行删除到包含ftp的行
				[root@localhost tmp]# sed -r "/root/,/ftp/d" /etc/passwd

			
		4\c与c分隔符
		
			\c与c只是一个代表,其中c可以换成任意一个字符
			#要求将/etc/passwd文件复制到/root/4.txt中,然后删除当中含/sbin/nologin的行.
				注意如果用了\c 与c 他就会完整的寻找里面的内容,要注意这块
			[root@localhost tmp]# sed -r "\C/sbin/nologinCd" 4.txt 
			[root@localhost tmp]# sed -r "\#/sbin/nologin#d" 4.txt 
							\c 与c也行    \# 与#也行,就是一个代表啥都行
				

sed的常用指令

sed的常用指令
		p	: 打印
		d   : 删除
		
		a   : 在当前行后添加一行或多行内容
			在第二行后添加内容,
			[root@localhost tmp]# sed "2a hhhhhh" 1.txt
                我是第1行
                我是第2行
                hhhhhh
                我是第3行
                我是第4行
                我是第5行
                我是第6行
                我是第7行
                我是第8行
                我是第9行
                我是第10行
			
		c   : 用新文本修改(替换)当前行中的文本
			第二行替换成xxxxx内容
			[root@localhost tmp]# sed "2c hhhhhh" 1.txt
                我是第1行
                hhhhhh
                我是第3行
                我是第4行
                我是第5行
                我是第6行
                我是第7行
                我是第8行
                我是第9行
                我是第10行
		
		i   : 在当前行之前插入文本
			[root@localhost tmp]# sed "2i hhhhhhh" 1.txt 
                我是第1行
                hhhhhhh
                我是第2行
                我是第3行
                我是第4行
                我是第5行
                我是第6行
                我是第7行
                我是第8行
                我是第9行
                我是第10行
			
		
		练习1 : 在/etc/passwd文件中1到3行之前插入HelloWorld
						1,3 范围   i之前插入 
			[root@localhost tmp]# sed "1,3i hello world" 1.txt 
                hello world
                我是第1行
                hello world
                我是第2行
                hello world
                我是第3行
                我是第4行
                我是第5行
                我是第6行
                我是第7行
                我是第8行
                我是第9行
                我是第10行		
			
			
		r   :从以外文件(文档)中读相关内容,写到相关行之后
			第1行-3行之后插入5.txt
			[root@localhost tmp]# cat 5.txt 
				迪迦奥特曼
            [root@localhost tmp]# sed "1,3r 5.txt" 1.txt 
                我是第1行
                迪迦奥特曼
                我是第2行
                迪迦奥特曼
                我是第3行
                迪迦奥特曼
                我是第4行
                我是第5行
                我是第6行
                我是第7行
                我是第8行
                我是第9行
                我是第10行
			
			
		w	: 匹配到的行写入一个新的文件之中
			匹配到的行写入到新的文件中去
			[root@localhost tmp]# sed "1,3w 6.txt" 1.txt 
			[root@localhost tmp]# cat 6.txt
                我是第1行
                我是第2行
                我是第3行
			
		y   :将字符转换成一个新的字符
			[root@localhost tmp]# sed  "1,5y/我/1/" 1.txt 
                1是第1行
                1是第2行
                1是第3行
                1是第4行
                1是第5行
                我是第6行
                我是第7行
                我是第8行
                我是第9行
                我是第10行		
			[root@localhost ~]# sed  "1,5y/sbin/1234/" /etc/passwd
			
				sbin   --->    1234
				
				s ---> 1
				b ---> 2
				i ---> 3
				n ---> 4
		
		s   : 用一个字符整体替换成另外一个字符
			前面的一个整体替换成另外一个字符
		[root@localhost tmp]# sed  "s/我/迪迦/" 1.txt 
            迪迦是第1行
            迪迦是第2行
            迪迦是第3行
            迪迦是第4行
            迪迦是第5行
            迪迦是第6行
            迪迦是第7行
            迪迦是第8行
            迪迦是第9行
            迪迦是第10行
		
		
			s指令替换对于"行"来说,是非贪婪性,如果需要全局替换则需要使用 g 指令
			替换一次就不会替换了 "行" "行" "行" 重要事情说三遍 ,对于行只是替换一次 如果这一行还有要替换的内容,则不会替换 

		g   : 全局执行
			s在开始g在结束,全局替换
			[root@localhost tmp]# sed  "s/我/迪迦/g" 1.txt 
		i   : 配合s指令配合一起使用时,则是忽略大小写的作用
			[root@localhost tmp]# sed  "s/我/迪迦/i" 1.txt 
		
		
		在后面的 p 打印
				d删除
				g全局
				i忽略大小写 和s配合 正常i在前面 和s一起他在后面

练习

	练习:
	
		练习1:替换/etc/passwd中的root为ROOT
			[root@localhost tmp]# sed "s/root/ROOT/g" /etc/passwd
		
		练习2:将模板机(192.168.15.222)中的ip替换成192.168.15.50
			[root@localhost tmp]# sed "s/\.222/\.50/g" /etc/sysconfig/network-scripts/ifcfg-eth0
			
		练习3:删除/etc/passwd中的所有偶数行
			[root@localhost tmp]# sed "1~2d" /etc/passwd 删除奇数行
			[root@localhost tmp]# sed "2~2d" /etc/passwd 删除偶数行
			############1~2!d  代表1~2这个整体取反     1~2 代表奇数
			[root@localhost tmp]# sed "1~2!d" /etc/passwd 删除偶数行
			[root@localhost tmp]# sed "1~4d" /etc/passwd 删除第一行第五行第九行,四倍的行
		练习4:在每一行的行首增加#号
								^ * 以零个空格或多个空格开始 
			[root@localhost tmp]# sed   "s/^ */#/g" 1.txt 
                #我是第1行
                #我是第2行
                #我是第3行
                #我是第4行
                #我是第5行
                #我是第6行
                #我是第7行
                #我是第8行
                #我是第9行
                #我是第10行
                #我是迪迦第1行		
		
		练习5:将Hello World替换成World Hello 
			[root@localhost tmp]# cat 6.txt 
				hello world
			[root@localhost tmp]# sed -r "s/(hello)( world)/\2 \1/g" 6.txt 
			 world hello

		练习6:将1.txt中的每一行都添加一个.bak的后缀
						.* 全部任意字符 ,替换成全部字符 后面再加个.bak
			[root@localhost tmp]# sed -r "s/(.*)/\1\.bak/g" 1.txt
                我是第1行.bak
                我是第2行.bak
                我是第3行.bak
                我是第4行.bak
                我是第5行.bak
                我是第6行.bak
                我是第7行.bak
                我是第8行.bak
                我是第9行.bak
                我是第10行.bak		











 

posted @ 2021-10-08 08:24  迪迦张  阅读(101)  评论(0编辑  收藏  举报