sed 擅长取行。工做中三剑客使用频率最高,本篇文章将对sed命令经常使用的 增,删,改,查
node
进行详细讲解,以备之后工做中遗忘了查询,sed命令是做为运维人员来讲,必须必掌握的技能正则表达式
若是三剑客你不会,那么你不用作运维了。运维
sed简介:编辑器
是一种流编辑器,它是文本处理中很是中的工具,可以完美的配合正则表达式使用,功能与众不同。处理ide
时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓工具
冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。测试
文件内容并无 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件spa
的反复操做;编写转换程序等。
orm
添加测试文本:blog
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 -v |
-n 取消默认输出 -r 支持正则表达式 -p 打印 -e 多项编辑 -i.bak 修改后备份 s 搜索一次 sg 搜索全局 # # # : s#替换前#替换后#g / / / : 与###同样 |
-i : 在 XX行的下一行增长内容
-a: 在XX行的上一行增长内容
[root@chenleilei ~]# sed '2i nihaoya' sed.log 101,$oldboy,CEO nihaoya 102,$zhangyao,CTO 103,$Alex,COO 104,$yy,CFO 105,$feixue,CIO |
[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:演示
[root@chenleilei ~]# sed '2a nihaoya' sed.log 101,$oldboy,CEO 102,$zhangyao,CTO nihaoya 103,$Alex,COO 104,$yy,CFO 105,$feixue,CIO |
[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 |
[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删除案例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 |
修改:
案例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,CEO103,$Alex,COO105,$feixue,CIO |