sed命令详解

sed 流式编辑器

非交互对文本实现增 删 改 查等操作

工作方式

逐行处理

使用命令

 

1、前置指令 | sed 选项 (定址符)指令
2、sed 选项 (定址符)指令  被处理的文档

- 选项
-n 屏蔽默认输出
-r 支持扩展正则
-i 写入文件
- 指令
p 输出
d 删除
s 替换
i 指定行上插入文本
a 指定行下追加文本
c 替换指定的行
- 定址符
删除的文字 行号
    
    [root@A opt]# head -5 /etc/passwd > user
    [root@A opt]# sed -n 'p' user
    
    # 显示第一行
    [root@A opt]# sed -n '1p' user 
    # 显示第一行 到第3行
    [root@A opt]# sed -n '1,3p' user
    # 显示第一行 以及后两行
    [root@A opt]# sed -n '1,+2p' user
    # 显示第一行 和 第3行
    [root@A opt]# sed -n '1p;3p' user
    # 显示奇数行
    [root@A opt]# sed -n '1~2p' user
    # 显示偶数行
    [root@A opt]# sed -n '2~2p' user
    # 输出有root的行
    [root@A opt]# sed -n '/root/p' user
    # 输出以nologin结尾的行
    [root@A opt]# sed -n "/nologin$/p" user
    # 输出以root 或者bin 开头的行
    [root@A opt]# sed -nr "/^(root|bin)/p" user
    # 查看最后一行的行号
    [root@A opt]# sed -n "$=" user
    # 查看最后一行
    [root@A opt]# sed -n "$p" user
    
    
    # 删除奇数行
    [root@A opt]# sed "1~2d" user
    # 删除最后一行
    [root@A opt]# sed "$d" user
    # 删除有root的行
    [root@A opt]# sed "/root/d" user
    # 删除没有root的行
    [root@A opt]# sed "/root/!d" user

s替换

s/旧内容/新内容/ 替换符 可以随便更换 主要是与内容不冲突

 

    
    [root@A opt]# cat test
    2017 2011 2018
    2017 2017 2024
    2017 2017 2017
    # 替换每一行的第二个2017
    [root@A opt]# sed "s/2017/xxxx/2" test
    
    # 替换每一行到第2行的第一个2017
    [root@A opt]# sed "1,2s/2017/xxxx/" test
    
    # 替换每一行到第2行的第一个2017
    [root@A opt]# sed "3s/2017/xxxx/3" test
    # 替换包含2024的行的第一个2017
    [root@A opt]# sed "/2024/s/2017/xxxx/" test
    # 替换包含2024的行的所有2017
    [root@A opt]# sed "/2024/s/2017/xxxx/g" test
    
    # 替换 
    [root@A opt]# sed "s#/bin/bash#/sbin/sh#g" test
    

编写脚本 实现部署ftp服务,并实现匿名上传

 

注意防火墙 selinux

/etc/vsftpd/vsftpd.conf
#anon_upload_enable=YES
    
    #!/bin/bash
    # 安装ftp服务 并且启动匿名上传
    yum -y install vsftpd
    sed -i "/#anon_up/s/#//" /etc/vsftpd/vsftpd.conf
    systemctl restart vsftpd
    systemctl enable vsftpd
    chmod 777 /var/ftp/pub

在真机打开文件夹: 输入 ftp://192.168.4.7 ,可随意拖拽普通文档到服务器即成功

sed 删除每行的第二个和最后一个字符

 


    [root@system1 opt]# sed "s/.//2;s/.$//" test

每行的第一个与倒数第一个互换

 


    [root@system1 opt]# sed -r "s/^(.)(.*)(.)$/\3\2\1/" test

删除所有的数字

 


    [root@system1 opt]# sed -r "s/[0-9]//g" test

为每个大写字母添加括号

 

	[root@system1 opt]# sed -r "s/([A-Z])/(\1)/g" test

大小写替换

 

	
	[root@system1 opt]# sed "s/[a-z]/\u&/g" test
	
	[root@system1 opt]# sed "s/[a-z]/\l&/g" test

删除所有的行首空格

 

	[root@system1 opt]# sed "s/^ +//" test

指令 i的使用

在第2行的上面添加一行 666 666

 

	[root@system1 opt]# sed "2i 666 666" test

指令 c的使用

把第一行和第2行都替换成 666

 

	
	[root@system1 opt]# sed -e "1c 666" -e "2c 666" test
	
	#!/bin/bash
	# 找出使用bash登录shell的用户,列出这些用户的shadow密码记录,按每行‘用户名-->密码记录’保存到getupwd.log
	for i in `sed -n "/bash$/p" /etc/passwd`
	do
	        a=${i%%:*}
	        b=`sed -n "/^${a}:/p" /etc/shadow`
	        b=${b#*:}
	        b=${b%%:*}
	        echo "${a}-->${b}" >> /opt/getupwd.log
	done
	
	
	
	
	
	#!/bin/bash
	# 找出使用bash登录shell的用户,列出这些用户的shadow密码记录,按每行‘用户名-->密码记录’保存到getupwd.log
	for i in `sed -n "/bash$/s/:.*$//p" /etc/passwd`
	do
	        b=`sed -nr "/^${i}:/s/^${i}:([^:]+):.*$/\1/p" /etc/shadow`
	        echo "${i}-->${b}" >> /opt/getupwd.log
	done

评论