背景
做运维一年了,突然发现自己python和php写了不少。基本的shell却一直搁置没有系统性的去学习总结。 其实在日常工作中,能合理高效的使用shell会提高不少效率。这也是运维工程师必备的基本素质。所以这里决定把一些简单的shell知识点写下来备忘。本博文并没有什么技术含量,主要是用来总结与备忘的,众位求知者可绕行。
内容
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
1 |
使用语法:sed [option] 'command' input_file |
option 代表sed的编辑参数,常用的有以下几种:
-
1<strong>-n</strong> 使用安静(silent)模式(想不通为什么不是-s)。在一般sed的用法中,所有来自stdin的内容一般都会被列出到屏幕上。但如果加上-n参数后,则只有经过sed特殊处理的那一行(或者动作)才会被列出来;
-
1<strong>-e</strong> 直接在指令列模式上进行 sed 的动作编辑;
-
1<strong>-f</strong> 直接将 sed 的动作写在一个文件内,-f filename 则可以执行filename内的sed命令;
-
1<strong>-r</strong> 让sed命令支持扩展的正则表达式(默认是基础正则表达式);
-
1<strong>-i</strong> 直接修改读取的文件内容,而不是由屏幕输出。
command 主要包括 [ n1[,n2] ] function 。
n1, n2 :不见得会存在,一般代表(选择进行动作的行数),举例来说,如果我的动作是需要在 10 到 20 行之间进行的,则( 10,20[动作行为] )。
function:
1 2 3 4 5 6 7 8 9 10 11 |
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~ c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行! d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚; i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行); p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~ s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦! |
典例:查看test.txt 文件中的第3行。
1 |
sed -n '3p' test.txt |
接下来,我们逐个示范使用options来查看了解:
1. sed的 a 新增
典例1: 在第一行后面添加”add one”字符串
$ sed ‘1a \add one’ test.txt
1 2 3 4 5 6 7 8 |
this is first line add one this is second line this is third line this is fourth line this is fifth line happy everyday end |
典例2: 在第二行到第四行后面添加”add one”字符串
sed ‘2,4a \add one’ test.txt
sed ‘2,$a \add one’ test.txt
典例3: 在含有first的行后面添加”add one” 字符串
sed ‘/first/a \add one’ test.txt
2. sed 的i插入
i命令使用方法和a命令一样的,只不过是在匹配的行的前面插入字符串,所以直接将上面a命令的示例的a替换成i即可。
3. sed 的c替换
典例1: 将第2行的内容替换为”add one”字符串
sed ‘2c \add one’ test.txt
典例2:将第四行到最后一行的内容替换为”add one”字符串
sed ‘2,$c \add one’ test.txt
可以看出,其实还是和之前的a添加格式一模一样,只是功能变了而已。
4. sed 的d删除
典例1: 删除第二行到最后一行的内容。
sed ‘2,$d ‘ test.txt
典例2: 删除以ha开头,以day结尾的行。
sed ‘/^ha.*day$/d’ test.txt
5. sed 的s替换命令
典例1: 将文件中的所有line替换成text。
sed ‘s/line/text/g’ test.txt
感觉和其他的都不太一样,s放在了前面,最后的g是global的意思,也就是全局替换,如果不加g,则只会替换本行的第一个line。
典例2:匹配以ha开始,以day结尾的行,然后再将该行中的happy替换成very happy。
sed ‘/^ha.*day$/ s/happy/very happy/g’ test.txt
参考:
http://qifuguang.me/2015/09/21/sed命令详解/
http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856901.html