day14 linux三剑客之sed命令

day14 linux三剑客之sed命令

sed命令

Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
sed(流式编辑器) : sed主要用来修改文件。

1、sed命令

    sed [参数] "[定位][指令]" 处理的文本路径
    注:不指定定位,则默认处理全文。

    指令:
        p : 打印文本
        d : 删除文本

    参数:
        -e : 允许多项编辑
        -n : 取消默认输出
        -i : 就地编辑文本
        -r : 支持扩展正则表达式(sed中的正则表达式必须放在两个//中间)
        -f :指定定位规则的文件
        
案例1:打印第1行和第5行
	[root@localhost ~]# sed -n -e '1p' -e "5p" 1.txt       # p指令为打印文本,-n只打印匹配到的
	
案例2:在文本中,要求只打印第1,5,6三行
	[root@localhost ~]# sed -n -e '1p' -e '5p' -e '6p' 1.txt
	
案例3:要求删除文件的第三行
    [root@localhost ~]# sed -i '3d' 1.txt
    
案例4:删除/etc/nginx/nginx.conf文件中所有的注释的行
	[root@localhost ~]# sed -i -r "/^ *#|^$/d" /etc/nginx/nginx.conf   # 加上i会真的删除
	
5、删除1.txt的3行,打印第4行
	[root@localhost ~]# vim 2.txt               # 编辑文本
	3d  # 删除第3行
	4p  # 打印第4行
	[root@localhost ~]# sed -f 2.txt 1.txt      # -f参数,可以编辑文本,根据文本内容来执行相应的命令
	
6、要求将/etc/passwd文件复制到/root/1.txt中,然后删除当中包含/sbin/nologin的行
	[root@localhost ~]# cat /etc/passed > 1.txt
	[root@localhost ~]# sed -i "/\/sbin\/nologin/d" 1.txt    # //是包含的意思,\是转义的意思
	
7、将/etc/nginx/nginx.conf文件中所有的注释的行(以#开头的行)全部删除
    [root@localhost ~]# sed -i -r "/^ *#/d" /etc/nginx/nginx.conf

sed + 正则表达式(定位)

1、数字
	1)、固定定位:[root@localhost ~]# sed -n '5p' 1.txt 
	2)、范围定位:[root@localhost ~]# sed -n '1,5p' 1.txt 
	
2、正则:
	正则表达式必须放在//之间,使用扩展正则前面不需加 -r参数
	
	例子1:打印/etc/passwd文件中包含root的行
		[root@localhost ~]# sed -n '/root/p' 1.txt      # //:包含
		
	例子2:将包含空格的行打印出来
    	[root@localhost ~]# sed -n -r "/ +/p" 1.txt     # +:至少占一个或多个前导字符
    	
3、数字加正则
    正则匹配是非贪婪性的匹配
    贪婪性   :贪婪性是匹配到了之后,不停继续匹配,直至文件所有的内容全部匹配完毕
    费贪婪性 :非贪婪性匹配,一旦匹配到了就停止匹配
    
    例子1:在/etc/passwd文件中的第一行,到包含test的行,全部删除
        [root@localhost ~]# sed "1,/test/d" 1.txt      # 从1到test行都删除,只留下test下面的
        test01:x:1000:1000::/home/test01:/bin/bash
        test02:x:993:994:简介:/home/test02:/bin/bash
    
    例子2:删除从包含root的行到第5行的内容
        [root@localhost ~]# sed -r "/root/,5p" 1.txt
        
    例子3:从包含root的行删除到包含ftp的行
    	[root@localhost ~]# sed "/root/,/ftp/d" 1.txt
    	
4、\c与c分隔符:也是转义的意思
	\c与c只是一个代表,其中c可以换成任意一个字符
	
	例子1:要求将/etc/passwd文件复制到/root/1.txt中,然后删除当中包含/sbin/nologin的行
	[root@localhost ~]# cat /etc/passed > 1.txt
	[root@localhost ~]# sed -i "/\/sbin\/nologin/d" 1.txt
	还可以用这种方式做:
	[root@localhost ~]# sed "\A/sbin/nologinAd" 1.txt     # \A  A :可以替换成任意字符,也是转义的意思
	[root@localhost ~]# sed "\M/sbin/nologinMd" 1.txt     # \M  M :可以替换成任意字符,也是转义的意思

sed的常用指令

sed的常用命令
	p		:打印
	d		:删除
	a		:在当前后添加一行或者多行内容
	c		:用新文件修改(替换)当前行中的文本
	i		:在当前行之前插入文本
	r		:从外文件中读取相关内容,写到相关行之后
	w		:匹配到的行写入一个新的文件之中
	y		:将字符转换成一个新的字符
	s		:用一个字符替代整体替换成另外一个字符
	g		:全局执行
	sgi		:配合s指令配合一起使用i时,则是忽略大小的作用

sed常用指令的用法

案例1:在1.txt文本中第3行后添加nb
	[root@localhost ~]# sed '3a nb' 1.txt      # 使用的是a指令
	
案例2:用新的内容替换1.txt文本的内容
	[root@localhost ~]# sed '2c meng' 1.txt    # 使用的是c指令
	
案例3:在1.txt文本第3行内容之前插入新的内容
	[root@localhost ~]# sed '3i my name is meng' 1.txt    # 使用的是i指令
	[root@localhost ~]# sed '1,3i my name is meng' .txt   # 在范围1-3之前每行加新的内容

案例4:把1.txt内容添加到2.txt文本第3行后面
	[root@localhost ~]# sed '3r 1.txt' 2.txt  # 使用的是r命令,1.txt是读取内容,2.txt是需要添加的文件路径
	
案例5:把/etc/passwd/1-5行的内容写到新建的2.txt文件中
	[root@localhost ~]# sed '1,5w 2.txt' /etc/passwd      # 使用的是w指令,匹配到的行写入一个新的文件之中
	
案例6:将/etc/passwd中的sbin替换成1234
	[root@localhost ~]# sed '1,5y/sbin/1234/' /etc/passwd   # 但是有错误
    root:x:0:0:root:/root:/234/2a1h
    234:x:1:1:234:/234:/1234/4olog34
    替换原理:是一个字符替换一个字符		
            s ---> 1
            b ---> 2
            i ---> 3
            n ---> 4
            
案例7:用s指令可以解决将/etc/passwd中的sbin替换成1234的字符问题
	[root@localhost ~]# sed 's/sbin/1234/' 1.txt    # 整体替换一个字符
    # s指令替换对于行来说,是非贪婪性,替换过一次就不会再替换,如果需要全局替换则需要使用 g 指令。
    
案例8:全局替换/etc/passwd中的sbin替换成1234
	[root@localhost ~]# sed 's/sbin/1234/g' 1.txt     # 注意:g指令只能添加到后面,不然会报错
	
案例9:把/etc/passwd中ROOT忽略大小写替换成1234
	[root@localhost ~]# sed 's/ROOT/1234/gi' 1.txt    # 只有配合s g指令,i指令才会是忽略大小写的
	
案例10:替换/etc/passwd中的root为ROOT
	[root@localhost ~]# sed 's/root/ROOT/g' /etc/pwsswd
	
案例11:将模板机(192.168.15.200)中的ip替换成192.168.15.50
	[root@localhost ~]# sed 's/\.200/\/50/g' /etc/sysysconfig/network-scripts/ifcfg-eth[01]
	
案例12:删除/etc/passwd中的所有偶数行
    [root@localhost ~]# sed '1~2d' /etc/pwsswd   # 1~2:偶数   1~3:代表奇数
    
案例13:在每一行的行首增加#号
	[root@localhost ~]# sed -r 's/^ */#/g' 1.txt   
	
案例14:将Hello World替换成World Hello 
	[root@localhost ~]# sed -r "s/(Hello) (World)/\2 \1/g" 2.txt    

案例15:将1.txt中的每一行都添加一个.bak的后缀
	[root@localhost ~]# sed -r "s/(.*)/\1\.bak/g" 1.txt   # 利用分组的特性,来修改后缀
上一篇:012a、批量执行&数据驱动


下一篇:Centos禁止用户登录