我为什么要详细记录sed命令:
    sed 擅长取行。工作中三剑客使用频率最高,本篇文章将对sed命令常用的 增,删,改,查
进行详细讲解,以备以后工作中遗忘了查询,sed命令是作为运维人员来说,必须必掌握的技能
如果三剑客你不会,那么你不用做运维了。

sed简介:
是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理
时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓
冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。
文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件
的反复操作;编写转换程序等。


添加测试文本:

cat >sed.log<<"EOF"
101,$oldboy,CEO
102,$zhangyao,CTO
103,$Alex,COO
104,$yy,CFO
105,$feixue,CIO
>>"EOF"


sed的语法格式:
sed [选项] [指令] [输入文件]

sed命令的执行流程:
sed命令是把文件一行行的读到内存中当成一行处理, 它也被称为流编辑器,跟车间中的流水线一样,一行一行的逐个处理。获取到需要的内容后显示到屏幕上。



sed原理:
sed 读取一行内容后,sed判断是否满足条件


sed版本查看:

 sed -v

sed基础参数:

-n 取消默认输出
-r 支持正则表达式
-p 打印
-e 多项编辑
-i.bak  修改后备份 
s 搜索一次
sg 搜索全局
# # #  : s#替换前#替换后#g
/ / / : 与###一样

sed功能详解:

sed增加:
-i : 在 XX行的下一行增加内容
-a: 在XX行的上一行增加内容


sed  i参数 :演示
增:
案例1:sed单行增加
[root@chenleilei ~]# sed '2i nihaoya' sed.log

101,$oldboy,CEO

nihaoya

102,$zhangyao,CTO

103,$Alex,COO

104,$yy,CFO

105,$feixue,CIO

案例2:sed行前多行增加
[root@chenleilei ~]# sed '2i nihaoya\nwohenhao' sed.log

101,$oldboy,CEO

nihaoya

wohenhao

102,$zhangyao,CTO

103,$Alex,COO

104,$yy,CFO

105,$feixue,CIO



-a:演示
【增】案例1:sed行后单行增加
[root@chenleilei ~]# sed '2a nihaoya' sed.log

101,$oldboy,CEO

102,$zhangyao,CTO

nihaoya

103,$Alex,COO

104,$yy,CFO

105,$feixue,CIO 
【增】案例2:sed行后多行增加
[root@chenleilei ~]# sed '2a nihaoya\nwohenhao' sed.log
101,$oldboy,CEO
102,$zhangyao,CTO
nihaoya
wohenhao
103,$Alex,COO
104,$yy,CFO
105,$feixue,CIO
【增】案例3:sed 不同行多项增加 sed -e
[root@chenleilei ~]# sed -e '2i 123' -e '5i 456' sed.log

101,$oldboy,CEO

123

102,$zhangyao,CTO

103,$Alex,COO

104,$yy,CFO

456

105,$feixue,CIO



sed删除 (d)
【删】sed删除案例1: 删除指定行
[root@chenleilei ~]# sed '4d' sed.log

101,$oldboy,CEO

102,$zhangyao,CTO

103,$Alex,COO

105,$feixue,CIO

【删】sed删除案例2:删除连续的行
[root@chenleilei ~]# sed '2,4d' sed.log

101,$oldboy,CEO

105,$feixue,CIO


【删】sed删除案例3:删除不连续的行
seq 10 |sed -e{2,4,8}d    ##注意这里不能添加引号或者双引号,否则报错

【删】sed 删除案例4: 删除 n和n 匹配的行
[root@chenleilei ~]# sed -nr '/103|105/!p' sed.log 
101,$oldboy,CEO
102,$zhangyao,CTO
104,$yy,CFO                ### !除了103.105开头的行 都删除 然后打印

【改.替换】sed修改案例1:
修改:
 案例1:修改单个字符
[root@chenleilei ~]# sed 's#102#1031#g' sed.log

101,$oldboy,CEO

1031,$zhangyao,CTO

103,$Alex,COO

104,$yy,CFO

105,$feixue,CIO

案例2: 修改101为109
[root@chenleilei ~]# sed -r '1s#[0-9]+#109#' sed.log

109,$oldboy,CEO

102,$zhangyao,CTO

103,$Alex,COO

104,$yy,CFO

105,$feixue,CIO


案例3: 把101改为oldboy  ----报错原因:sed -r 一个一个读取,读取到有数字就改为
oldboy,这里有3个数字,所以出现了3个oldboy
[root@chenleilei ~]# sed '1s#[0-9]#oldboy#g' sed.log

oldboyoldboyoldboy,$oldboy,CEO

102,$zhangyao,CTO

103,$Alex,COO

104,$yy,CFO

105,$feixue,CIO


解决办法(-r):
[root@chenleilei ~]# sed -r '1s#[0-9]+#oldboy#g' sed.log

oldboy,$oldboy,CEO

102,$zhangyao,CTO

103,$Alex,COO

104,$yy,CFO

105,$feixue,CIO


如果配错了那么3个oldboy 如何改回101呢?
[root@chenleilei ~]# sed -r '1s#(oldboy)+#101#' sed.log

101,$oldboy,CEO

102,$zhangyao,CTO

103,$Alex,COO

104,$yy,CFO

105,$feixue,CIO


如果你写成了
sed -r '1s#(oldboy)+#101#g' sed.log  
也会不成功,那是因为 他有g选项,会全部替换,也就是3个oldboy。解决办法
把 oldboy 使用括号括起来,然后使用 s 尾部的g不要使用,g就是变成3个oldboy的源泉

sed -ri 修改后备份,但是,i 必须要放在最后,否则无法备份
例子: sed -ri '/^123/d' 1.txt

sed -i 的工作原理:
    sed -i.bak修改文件的时候,他会把源文件移动,然后创建新的文件,写入这个命令的结果。
可以通过修改文件后使用 ls -il  x x.bak   来查看 x文件 和他的备份文件 x.bak 。你会发现他们的inode就不一样了。这就是sed -i.bak 的原理

小问题:
echo用来给文件追加多行内容的时候,需要使用 echo -e


【查询】  |  是正则符号需要加r
[显示] 1到4行
[root@chenleilei ~]# sed -n '1,4p' sed.log
101,$oldboy,CEO
102,$zhangyao,CTO
103,$Alex,COO
104,$yy,CFO

【查询】  |  是正则符号需要加r
  排除1-4行
[root@chenleilei ~]# sed -n '1,4!p' sed.log

105,$feixue,CIO


[查询]显示2 4 两行
[root@chenleilei ~]# sed -nr '/2|4/p' sed.log

102,$zhangyao,CTO

104,$yy,CFO


[查询] 查询103开头的行
[root@chenleilei ~]# sed -n '/^103/p' sed.log

103,$Alex,COO

[查询] 查询103结尾的行
[root@chenleilei ~]# sed -n '/$103/p' sed.log 
103,$Alex,COO,103

[查询] 查询103开头105开头的行(正则)
[root@chenleilei ~]# sed -n '/^103/,/^105/p' sed.log

103,$Alex,COO

104,$yy,CFO

105,$feixue,CIO


[查询] 查询 105以及 和 103 开头的行(正则 需要加 r)
[root@chenleilei ~]# sed -nr '/^103|^105/p' sed.log

103,$Alex,COO

105,$feixue,CIO


[排除] 排除一行
[root@chenleilei ~]# sed -n '1!p' sed.log

102,$zhangyao,CTO

103,$Alex,COO

104,$yy,CFO

105,$feixue,CIO


[排除] 排除多行
[root@chenleilei ~]# sed -n '1,2!p' sed.log

103,$Alex,COO

104,$yy,CFO

105,$feixue,CIO


[排除不连续的行]
[root@chenleilei ~]# sed -nr '/102|104/!p' sed.log

101,$oldboy,CEO

103,$Alex,COO

105,$feixue,CIO

sed 增删改查详解以及 sed -i原理的更多相关文章

  1. iOS CoreData 增删改查详解

    最近在学习CoreData, 因为项目开发中需要,特意学习和整理了一下,整理出来方便以后使用和同行借鉴.目前开发使用的Swift语言开发的项目.所以整理出来的是Swift版本,OC我就放弃了. 虽然S ...

  2. 【ASP.NET MVC】jqGrid 增删改查详解

    1   概述 本篇文章主要是关于JqGrid的,主要功能包括使用JqGrid增删查改,导入导出,废话不多说,直接进入正题. 2   Demo相关 2.1   Demo展示 第一部分 第二部分 2.2 ...

  3. C# 数据操作系列 - 15 SqlSugar 增删改查详解

    0. 前言 继上一篇,以及上上篇,我们对SqlSugar有了一个大概的认识,但是这并不完美,因为那些都是理论知识,无法描述我们工程开发中实际情况.而这一篇,将带领小伙伴们一起试着写一个能在工程中使用的 ...

  4. java基础: ArrayList集合应用, ArrayList增删改查详解,综合java基础实现学生管理系统,

    1.ArrayList 集合和数组的区别 : 共同点:都是存储数据的容器 不同点:数组的容量是固定的,集合的容量是可变的 1.1 -ArrayList的构造方法和添加方法 public ArrayLi ...

  5. Yii2.0数据库操作增删改查详解

    1.简单查询: one(): 根据查询结果返回查询的第一条记录. all(): 根据查询结果返回所有记录. count(): 返回记录的数量. sum(): 返回指定列的总数. average():  ...

  6. Easyui datagrid扩展子网格detailview增删改查详解

    话不多gang,先上代码,将以下三个属性插入主网格的初始化参数中: view : detailview, //1 detailFormatter : function(index, row) { // ...

  7. linux的sed(增删改查)使用方法

    sed的增删改查的基本操作 参考:https://www.cnblogs.com/0zcl/p/6855740.html 01:增(a) 2个sed命令,分别是:(这些操作都是在内存中进行的,所以不会 ...

  8. JavaScript---Dom树详解,节点查找方式(直接(id,class,tag),间接(父子,兄弟)),节点操作(增删改查,赋值节点,替换节点,),节点属性操作(增删改查),节点文本的操作(增删改查),事件

    JavaScript---Dom树详解,节点查找方式(直接(id,class,tag),间接(父子,兄弟)),节点操作(增删改查,赋值节点,替换节点,),节点属性操作(增删改查),节点文本的操作(增删 ...

  9. SQLAlchemy02 /SQLAlchemy对数据的增删改查操作、属性常用数据类型详解

    SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 目录 SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 1.用se ...

随机推荐

  1. elasticsearch5.6.8中文分词器

    安装分词器,务必确保版本一致! 下载地址:https://github.com/medcl/elasticsearch-analysis-ik 为了保证一致,我特地将elasticsearch进行降级 ...

  2. 完全卸载oracle11g步骤:

    完全卸载oracle11g步骤:1. 开始->设置->控制面板->管理工具->服务 停止所有Oracle服务.2. 开始->程序->Oracle - OraHome ...

  3. 记录一下学习Android的小知识

    目前要设计即时通讯的整体架构,包括服务端.Android.IOS.PC.平板等等系统,所以需要研究一下手机的实现方式,开始从Android入手,偶尔在这记录下小知识. ADT: 1.页面功能请求结构, ...

  4. 如何查看apache加载了哪些模块

    apache2/bin/apachectl -l 可以看到类似下面的结果: 这是编译时就已编译在apache中的模块,启动时自然会加载. 另外一部分,要看apach的配置文件(httpd.conf)的 ...

  5. pandas分组和聚合

    Pandas分组与聚合 分组 (groupby) 对数据集进行分组,然后对每组进行统计分析 SQL能够对数据进行过滤,分组聚合 pandas能利用groupby进行更加复杂的分组运算 分组运算过程:s ...

  6. redis学习六 集群的原理(转载)

    转载自 http://shift-alt-ctrl.iteye.com/blog/2285470 一.Redis Cluster主要特性和设计     集群目标 1)高性能和线性扩展,最大可以支撑到1 ...

  7. Vue 简单的总结二

    表单输入绑定 数据双向绑定 v-model 绑定相同的属性 当属性变化绑定的标签内容也跟着变化 v-model 只能应用像在input textare select 标签 v-model.lazy 懒 ...

  8. linux rz -e

    linux shell rz和sz是终端下常用的文件传输命令,rz和sz通过shell被调用,其中rz用于从启用终端的系统上传文件到目标系统(终端登录的目标系统), 这里不过多介绍这些命令,只是记录一 ...

  9. 通过window.crypto.getRandomValues获得一个大于零的随机数

    window.crypto.getRandomValues(new Uint32Array(1))[0]; 浏览器支持情况如下: IE: no IE Mobile: no Firefox24+ Fir ...

  10. Tornado 接口的实现