三剑客之-sed
第一章 Sed 功能介绍、参数解释、增-删-改-查 测试
1、软件功能与版本
sed命令是操作、过滤和转换文本内容的强大工具、常用功能有增、删、改、查(增加、删除、修改、查询),其中查询的功能中最常用的2大功能是过滤(过滤指定字符),取行(取出指定行)。
2、语法格式
sed # stream editor 流编辑器 linux三剑客之一排行老二 擅长取行
语法:sed [OPTION]... {sed-dommands} [input-file] / sed [参数] ['内容'] file
注意:
sed 以及后边选项、sed命令和输入文件,每个元素之间都至少有一个空格。
sed-commands既可以是单个sed命令,也可以是多个sed命令组合。
input-file(输入文件)是可选项,sed还能够从标准输入如管道获取输入
3、命令执行流程
概括流程:Sed软件从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行....
一次一行的设计使得sed软件性能很高,sed在读取非常庞大的文件时不会出现卡顿的现象。用vi命令打开几十M或更大的文件,会发现有卡顿现象,这是因为vi命令打开文件是一次性将文件加载到内存,然后再打开,因此卡顿的时间长短就取决于从磁盘到内存的读取速度了。而且如果文件过大的话还会造成内存溢出现象。sed软件就很好的避免了这种情况,打开速度非常快,执行速度也很快。
详细流程:现有一个文件test.txt,共有五行文本,sed命令读入文件test.txt的第一行“101,A”,并将这行文本存入模式空间(sed软件在内存中的一个临时缓存,用于存放读取到的内容,比喻为工厂流水线的传送带。)
文件test.txt在模式空间的完整处理流程:
(1)判断第1行是否是需要处理的行,如果不是要处理的行就重新从文件读取 下一行,如果是要处理的行,则接着往下走:
(2)对模式空间的内容执行sed命令,比如a(追加)、i(插入)、s(替换)......
(3)将模式空间中经过sed命令处理后的内容输出到屏幕上,然后清空模式空间:
(4)读取下一行文本,然后重新执行上面的流程,直到文件结束。
4、 选项说明:
5、 使用范例
5.1 测试文本
5.2 增
命令详解:
sed打头,然后接上空格(空格个数不限,但至少要有一个),在空格后面,我们先敲上一对单引号('')
(1)数字代表指定的对第几行记性操作,其他行忽略。
(2)i代表插入的意思,2i即在第2行前插入文本。
(3)2i后面加上空格,然后跟上你想要插入的文本即可。
sed默认只是处理文件在内存中的数据及模式空间,并不会修改磁盘上的内容,想修改就需要另外一个sed选项“i”配合使用。
给文件第2行后添加2行空行。
5.3 多行增加
5.4 删
删除文件中的某些行。
“d”:删除命令,记忆方法:d的全拼是delete,意思是删除。
指定执行的地址范围
sed软件可以对单行或多行文本进行处理,如果在sed命令前面不指定地址范围,那么默认会匹配所有行。
用法:n1[,n2] {sed-commands}
地址用逗号分隔开,n1,n2可以用数字、正则表达式、或者二者组合表示。
sed命令前面不指定地址范围,默认会匹配所有行,然后使用d命令删除功能就会删除这个文件的所有内容。
5.5 特殊符号~(步长)解析
格式:“First~Step”表示从First行开始,以步长Step递增。这个在数学中叫等差数列。
例子:
5.6 特殊符号!解析
感叹号“!”,取反的意思。
命令说明:在地址范围"2,3"后边加上“!”,如果不加"!"表示删除第2行和第3行,结果如下面的例子所示,然后加上“!”的结果就是除了第2行和第3行以外的内容都删除。
[root@RedHat8-2 ~]# sed '2,3!d' test.txt
102,B
103,C
5.7 改
(1)按行替换
(2)文本替换
1)两边是引号,引号里面的两边分别为s和g,中间是三个一样的字符/或#作为定界符。#常用,如替换注释类文本可用/或其他定界符代替。
2)定界符/或#,第一个和第二个之间的就是被替换的内容,第二个和第三个之间的就是替换后的内容。
3)'s#■#▲#g' xty.log,■能用正则表达式,但▲不能用,必须是具体的,因为▲使用正则的话会让sed软件无所适从。它不知道你要替换什么内容。
4)默认sed软件是对模式空间(内存中的数据)操作,而-i选项会更改磁盘上的文件内容。
将需要替换的文本“test”放在第一个和第二个“#”之间,将替换后的文本“ceshi”放在第二个和第三个“#”之间。
5.8 指定行修改配置文件
sed命令“s”前没有指定地址范围,默认是对所有行进行操作。sed“s” 前加数字就代表对该行进行操作。
5.9 变量替换
变量替换就是将文本变成了变量进行替换。
5.10 分组替换(后向引用)
sed的\(\)的功能可以记住正则表达式的一部分,其中\1位第一个记住的模式即第一个小括号中的匹配内容,\2第二记住的模式,即第二个小括号中的匹配内容,sed最多可以记住9个。
不使用“-r”选项就使用转义字符号“\”(sed 不加-r 不支持扩张正则表达式),使用“-r”选项就可以直接使用“()”
执行命令取出eth0的ip地址
5.11 批量重命名文件
5.11.1 批量创建测试文件
5.11.2 批量重命名文件
5.11.3 批量重命名命令说明
(1)“\1”代表前面“(^.*)”匹配的内容,“&”代表“s# #”里被替换的内容,这里匹配到的是完整的文件名。
(2)使用bash命令执行,bash命名执行标准输入的语句,等同在命令行输入语句后敲回车。
ls |sed -r 's#(^.*)_210530(.*$)#mv & \1\2#'|bash
5.12 查
“p”:输出指定内容,但默认会输出2次匹配的结果,因此使用-n选项取消默认输出,p的全拼是print(打印
特殊情况:前两行没有匹配到C,就向后匹配,如果匹配到C就打印此行,匹配到文件结尾
第二章 进阶功能(修改、替换、精确匹配、=)
2.1 修改文件
真正修改文件内容需要使用-i选项,修改时需要提前备份,sed -i选项自带备份功能
-i [SUFFIX], --in-place[=SUFFIX]
-i [备份文件后缀], --in-place[=本分文件后缀]
测试文件内容:
备份并替换
2.2 sed替换命令Ms# # #Ng 的使用
语法说明:
Ms---对第M行处理,无g替换标志,只处理第一处匹配,有g标志则对第M行全部替换。
Ng---对每一行,从第N处开始替换。
Ms、Ng合用表示只对第M行从第N处匹配开始替换。
2.3 数字标志
数字标志,s# # #N,注意N后边没有g。表示替换每行中第N次出现的匹配项,属于精确匹配,N的取值范围1<N<512
2.4 特殊符号=获取行号
如何获取一个文件的行号
"$”代表最后一行,因此显示最后一行的行号,变相得出文件的总行数。
改进方法
2.5 分号;的使用
第2种方法使用;(分号)也可以执行多条命令。
正常执行命令
简化流程
sed测试
2.6 选项-f
第3种方法使用-f选项接sed脚本。把多个sed命令合并到一个文件中,这个文件被称为sed脚本,然后就使用-f选项调用它。
命令说明:使用sed选项-f接sed脚本test.sed。
案例:一个文件100行,把5,35,70行单独拿出来
awk取行
2.7 特殊符号{}的使用
{commands}可以把多个命令括起来,用来处理单个地址或者地址范围。
打印文件的第2到4行,并只显示这三行的行号
打印第2到4行
案例:svn账号密码
awk将换行\n替换方法
stu10312=sfls0ewe命令详解
(1)printf 与print的区别;默认情况printf不会自动添加换行符,需手动添加。
把\n替换成=
(2)getline的功能,读入下一行的输入赋予$0
==printf"%s=",$0
结果:st210503=(不换行)
==getline;print $0
结果:$0为slfjdlsf
拼起来
st210503=slfjdlsf(print自动换行)
2.8 操作多个文件
sed可以同时对多个文件处理。
2.8.1 合并两个文件(模拟cat)
2.8.2 模拟head命令
2.8.3 模拟wc命令