shell实战(一):sed命令小结

一、简介

sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

命令格式

sed [options] 'command' file(s)

二、sed命令

  • a :新增, a 的后面可以接字符串,而这些字符串会在新的一行出现(当前行的下一行)。
  • d :删除,删除选择的行。
  • i :插入, i 的后面可以接字符串,而这些字符串会在新的一行出现(当前行的上一行).
  • p :打印,通常 p 会与参数 sed -n 一起运行.
  • s :替换,替换指定字符,通常与正则表达式联用。

三、使用场景

1. sed 增加(i/a)

指定行号添加内容

# 在第三行的上方添加一行字符串
sed -i "3i\test123" aa.txt
# 在第三行的下方添加一行字符串
sed -i "3a\ceshi456" aa.txt

匹配行之后在其上方/下方添加内容

# 在vrrp_instance VI_1下方插入内容
sed -i '/vrrp_instance VI_1/a\    notify_master \"/etc/keepalived/xmha/keepalived.sh master\"\n    notify_backup \"/etc/keepalived/xmha/keepalived.sh backup\"\n    track_script {\n       check\n    }' keepalived.conf
# 在vrrp_instance VI_1上方插入内容
sed -i '/vrrp_instance VI_1/i\vrrp_script check {\n    script \"/etc/keepalived/xmha/checkServer.sh\"\n    interval 10\n}\n' keepalived.conf

解读:

  • a:代表apend,是在匹配行追加的意思。字母前面跟行号或匹配的内容。
  • i:代表insert,是在匹配行插入的意思。字母前面跟行号或匹配的内容。
  • \n:换行,可通过该参数插入多行内容。
  • \:转义符。

2. sed 输出(p)

# 输出文件所有内容
sed -n '1,$p' /etc/hosts
# 将每行内容放到一行上进行展示,每行内容以逗号进行分隔。
sed ':t;N;s/\n/,/;b t' /etc/hosts
# 输出第二行到第四行之间三行的内容
sed -n "2,4p" /etc/hosts

解读:

$p为最后一行的意思,'1,$p',是选择打印第一行到最后一行。必须用单引号表示,双引号会报错。

3. sed 替换(s)

  • 全文匹配替换
sed -i "s/http:\/\/.*/http:\/\/$ip:$1\";/g" app.js

app.js的局部内容

this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://10.6.6.71:9200";

解读:

动态替换全文匹配http://行之后的内容。\为转义符,用来转义/.*代表所有内容。

  • 指定行号匹配替换
sed -i "5s/port:.*/port: $2,/g" ../Gruntfile.js

Gruntfile.js的局部内容

connect: {
        server: {
                options: {
                        port: 9100,
                        base: '.',
                        keepalive: true
                }
        }
}

解读:

替换第4行的匹配的port之后的内容,.*代表所有内容。

4. sed 删除(d)

sed -i "/notify_master \"\/etc\/keepalived\/xmha\/keepalived.sh master\"/,+4d" keepalived.conf

# 远程主机删除文件内容
ssh 10.6.6.72 "sed -i '/notify_master \"\/etc\/keepalived\/xmha\/keepalived.sh master\"/,+4d' /etc/keepalived/keepalived.conf"

# 有特殊符号的行应该如何匹配删除
sed -i "/.*30 1 \* \* \* root sh \/etc\/keepalived\/xmha\/checkFile.sh/d" /etc/crontab

解读:

如果匹配字符串中有*/等特殊符号时,就需要转义符\来转义。

四、总结

本篇文章主要描述了sed命令的基本用法,如何对文件内容进行增删改查,并附上了我自己工作上遇到的小例子。当然,sed命令博大精深,我不可能每个用法都能兼顾,如果还想继续拓展的话,可以访问http://man.linuxde.net/sed学习sed更多用法。


发布了87 篇原创文章 · 获赞 24 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/CREATE_17/article/details/89440023