sed简介
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space) 接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。 文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
sed语法格式
sed 语法格式 sed [选项] '编辑指令' 文件 [定址符]处理动作 [地址1[,地址2]] # sed -n '2,4p' /etc/passwd -n取消默认输出 bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin
sed常见命令选项
-n 取消默认输出-i 直接修改文件内容-f 使用sed脚本-e 可指定多个处理动作(较少)-r 启用扩展正则,若与其他选项一起使用,应作为首选项 #echo gtms >test #sed -r 's#(.*)#i am \1#g' test i am gtms {} 组合多个命令,分号分隔定址符,即[地址1[,地址2]] 用来指定处理的起、止行数。省略时,默认全部行 地址可表示为文本的“行号”,或者 “/正则表达式/”进行匹配
sed处理动作
p 打印行 2,4p 2p;4p 分号 d 删除行 2,4d s字符串替换 s/old/new/替换每行的第一个 s/old/new/3替换每行的第三个 s/old/new/g替换所有 替换分隔符“/”可使用如#,&等,便于修改文件路径
文本输出
sed -n 'p' passwd 输出所有行 sed -n '4p' passwd 输出第4行 sed -n '4,7p' passw 输出第4-7行 sed -n '4,+2p' passwd 输出第4行及其后2行 sed -n '/4/p' passwd 匹配有4的行 sed -n 'p;n' passwd 输出奇数行 n即读入下一行 sed -n 'n;p' passwd 输出偶数行 sed -n '2,${n;p}' passwd 输出第2行开始的奇数行 sed -n '2,${p;n}' passwd 输出第2行开始的偶数行 sed -n '$=' passwd 输出文件总行数 $= 文件行数
删除文本 -i真修改
sed '3d;5d' passwd 删除第3行,第5行 sed '3,5d' passwd 删除3-5行 sed '/root/d' passwd 删除包含root的行 sed '/^root/d' passwd 删除以root开头的行 sed '$d' passwd 删除最后1行 sed '/^$/d' passwd 删除空行 sed '/^$/n;{/^$/d}' passwd 出现连续两个空行,则删除一个空行
文本替换 -i真修改
sed 's#root#ROOT#' passwd 将每行中的第1个root替换成ROOT sed 's#/root#ROOT#3' passwd 将每行中的第3个root替换成ROOT sed 's#root#ROOT#g' passwd 将所有root替换成ROOT sed 's#root##g' passwd 将所有root字串删除(置空) sed 's#root#&s#g' passwd 将所有root后加s,&代表查找串 sed '4,7s/^/#/' passwd 将4-7行注释 sed 's/^#//' passwd 将以#开头的#去除
sed文本块处理动作 -i真修改
i 行前插入 2iYY 在第2行之前插入YY文本行 4,7iYY 在4-7行每行前插入文本行a 行后插入 2ayy 在第2行后插入YY行 /^XX/aYY 在以XX开头的行之后插入YY行c 替换当前行 2cYY 将第2行内容修改为YY多行文本处理 # sed -i '1iXX\nYY' /tmp/passwd # head -3 /tmppasswd XX YY root:x:0:0:root:/root:/bin/bash 或# sed -i '1iXX\(回车) > YY' /tmp/passwd
案例
修改默认运行级别 # grep ^id /etc/inittab id:3:initdefault: #sed '/^id/s#[0-6]#5#' /etc/inittab # grep ^id /etc/inittab id:5:initdefault:修改网站根目录:将/var/www/html修改为/opt/wwwroot # grep "^DocumentRoot" /etc/httpd/conf/httpd.conf DocumentRoot "/var/www/html" # sed -i 's#/var/www/html#/opt/wwwroot#' /etc/httpd/conf/httpd.conf # grep "^DocumentRoot" /etc/httpd/conf/httpd.conf DocumentRoot "/opt/wwwroot" 更改主机名配置 # grep ^HOSTNAME /etc/sysconfig/network HOSTNAME=node90 # sed -i '/^HOSTNAME/cHOSTNAME=linux server' /etc/sysconfig/network # grep ^HOSTNAME /etc/sysconfig/network HOSTNAME=linux server
sed复制剪切 -i真修改
模式空间 存放当前处理的行,将处理结果输出 若当前不符合处理条件,则鸳鸯输出 处理完当前行再读入下一行来处理 保持空间 作用类似于“剪贴板” 默认存放一个空行(换行符\n) H 模式空间--追加-->保持空间 复制 h 模式空间--覆盖-->保持空间 复制 G 保持空间--追加-->模式空间 粘贴 g 保持空间--覆盖--->模式空间 粘贴 #sed '1,3H;$G' passwd 将第1到第3行复制到文件末尾 #sed '1h;2,3H;$G' passwd 同上。避免出现空行 #sed '1h;1d;$G' passwd 将第一行剪贴到文末尾 #sed '1h;2H;1,2d;$G' passwd 将第1第2行剪贴到文末
应用案例(ifconfig取ip)
#ifconfig eth0 | sed -n '2p'|sed 's#^.*dr:##g' | sed 's# B.*$##g' (把ip前后都sed掉)#ifconfig eth0 | sed -n '2p'|sed -r 's#^.*dr:(.*) Bc.*#\1#g'#ifconfig eth0 | sed -nr '2s#^.*dr:(.*) Bc.*$#\1#gp'#ifconfig eth0 | awk -F"[: ]+" 'NR==2 {print $4}'#ifconfig | grep " inet addr" | head -1 | cut -d ":" -f2 | awk '{print $1}'#ifconfig eth0 | sed -n '2p' | sed 's#^.*dr:##g' | cut -d " " -f1
修改网站根目录:将/var/www/html修改为/opt/wwwroot
# grep "^DocumentRoot" /etc/httpd/conf/httpd.conf
DocumentRoot "/var/www/html"
# sed -i 's#/var/www/html#/opt/wwwroot#' /etc/httpd/conf/httpd.conf
# grep "^DocumentRoot" /etc/httpd/conf/httpd.conf
DocumentRoot "/opt/wwwroot"