Linux中主要用grep sed awl三个命令对文件内容增删改查,它们被称为"文本三剑客"。本篇我们讲的是sed命令的用法。他们都属于流编辑器,逐行处理文件数据。
sed命令
sed的工作流程:读取--->执行--->显示。读取目标文件的每行数据依次加入到缓冲区(即模式空间)里,默认从第一行数据依次进行执行增删改查等命令,处理结束后将数据输出到屏幕显示。因为sed处理的整个过程是在模式空间中处理的,所以默认对原文本并不会进行更改,想要输出处理后的结果,需要重定向输出到一个新的文件中。
sed命令 | |
格式 | sed -n -e '操作' 文件1 文件2 ... sed -e ‘操作1 -e ‘操作2' 目标文件1 目标文件2... 同时多个操作多个文件方法一 sed -e '操作1;操作2...' 目标文件1 目标文件2... 同时多个操作多个文件方法二 -e '查’操作' 目标文件1 目标文件2... 只是查操作时-e可以省略 sed -e 'n{ |
常用选项 | -e 或--expression=:表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用。sed -e '操作' 文件1 文件2 ... -f 或--file=:表示用指定的脚本文件来处理输入的文本文件。sed -f 脚本文件 文件1 文件2 ... -n、--quiet 或 silent:禁止sed编辑器输出,但可以与p命令一起使用完成输出。 -i:直接修改目标文本文件。sed -i -e '操作' 文件1 文件2 ... |
常用操作 | s:替换,替换指定字符。 d:删除,删除选定的行。 a:增加,在当前行下面增加一行指定内容。 i:插入,在选定行上面插入一行指定内容。 c:替换,将选定行替换为指定内容。 y:字符转换,转换前后的字符长度必须相同。 p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。 =:打印行号。 l(小写L):打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t) |
方法三:大括号可以省略
1.sed打印(查看)行内容——p
查看文件内容打印到屏幕需要结合使用-n和p,不加-n会出现输出两遍,因为sed命令工作原理读取执行显示,我们看下不加-n是什么效果。
sed -n -e '1p' 1.txt #查看第1行的内容
sed -n -e '4,$p' 1.txt #查看4到最后一行的内容
sed -n -e '1,+2p' 1.txt #查看第1行和他后2行的内容
sed '2q' 1.txt #sed读取执行显示,执行显示到第2行后停止
sed -n -e '/1/p' 1.txt #查看包含1的行内容
sed -n -e 'p;n' 1.txt #从第一行开始打印,每次跳一行继续往下打印
sed -n -e '3,${n;p}' 1.txt #从第三行开始,先跳一行再打印行内容
sed -n -e '1~3p' 1.txt #打印第一行和从第一行开始每跨3行的行内容,也可以实现实现查看奇数行
sed -n -e '/^o/p' 1.txt #打印o开头的行内容
sed -n -e '/ne$/p' 1.txt #打印以ne结尾的行内容
sed -n -e '/ne$/=' 1.txt #打印以ne结尾的行号
sed -n -e '/ne$/{p;=}' 1.txt #打印文件中以ne结尾的行内容及行号
sed 过滤查看包含什么字符的行内容支持正则表达式,基础元字符可以直接使用,想要使用扩展元字符的话需要加-r才能实现。
sed -n -e '1,/ve$/{p}' 1.txt #打印从第1行开始到以ve结尾的行内容
sed -n -e '2,/e/p' 1.txt #打印从第2行开始到包含e的行内容
sed命令查看奇数行、偶数行内容
sed -n -e 'p;n' 1.txt #打印奇数行
sed -n -e 'n;p' 1.txt #打印偶数行
sed -n -e '1~2p' 1.txt #打印奇数行
sed -n -e '2~2p' 1.txt #打印偶数行
——-------------------------------------------------------------------------------------------------------------------------
2.sed删除行内容——d
sed '1d' 1.txt #表示删除第一行
sed '1,3d' 1.txt #表示删除第一行到第三行内容
sed '$d' 1.txt #表示删除最后一行的内容
sed '5d;$d' 1.txt #表示删除第5行和最后一行的内容
sed -e'/^$/d' 1.txt #表示删除空行
sed -e '/b/d' -e '/e/d' 1.txt #表示删除文件中包含b的行内容和包含e的行内容(这里有两个操作,不能省略-e)
sed '/e/!d' 1.txt #感叹号表示取反,文件中除了包含e的行内容进行删除
sed -e '/o/,/t/d' 1.txt #表示从包含o的行删除到包含t的行
sed -e '/1/,/2/d' 1.txt #表示文本中所有从包含1的行到包含2的行内容都删除
删除空行的三种方法
①cat file.txt | grep -v "^$"
②cat file.txt | tr -s '\n'
③sed -e -i '/^$/d' 1.txt 删除原文件里的空行,sed -i 直接修改原文件数据
使用自字符串做区间的‘/1,/3d’,要看删完以后有没有匹配的行内容,如果有他又会再执行删除操作,一般不用字符串开头。
————————————————————————————————————————
3. sed替换行内容
s(字符串替换) c(整行内容替换) y(对应字符替换)
sed -e '指定行范围 s/旧字符串/新字符串/g' 跟vim编辑器里用法相似
sed -e '行号区间 s/old/new/g' #替换行内容
sed -n -e '行号区间 s/old/new/gp' #打印被修改的行
sed -e '行号区间 s/old/new/gw 保存文件' #保存被修改的行
sed -e '/字符串/ s/old/new/g' #替换字符串
sed -r -e '/正则表达式/ s/old/new/g' #替换匹配表达式的内容
sed -r -e 's/(xxx)(xxx)(xxx)/\3\2\1/' #字符串重新排序
sed执行的时候可以先不加-i对原文件进行修改,确定生效的话再用-i对原文件进行操作
4.sed插入内容
sed -e ‘行号区间a 行内容’
sed -r -e ‘/字符串或正则/a 行内容’ 正则表达式前面加-r 。sed -e执行时一个操作可以省略-e
a 在指定行下面添加行内容
i 在指定行上面插入行内容
r 在指定行下面插入整个文件内容(读入别的文件的内容到本文件中)
sed -e '行号区间r 文件'
5.sed复制粘贴
sed '行号H;行号G'
{H;d}复制后删除;再接粘贴
题目:用sed完成部署DNS服务器,解析www.xy101.com IP地址