目录
一、理论
1.sed
二、实验
1.sed命令的寻址打印
2.显示奇偶
3.查找替换
4.后向引用
5.截取版本号
6.替换IP地址
一、理论
1.sed
(1) 概念
sed 英文全称为stream editor流式编辑器,sed 对输入流(文件或来自管道的输入)执行基本文本转换单通过流,所以效率很高。 但是, sed 能够管道过滤文本,特别区别于其他类型的编辑器。
sed 可以在命令行或 shel l脚本中使用,以非交互方式编辑文件。 也许最有用的功能是对一个字符串进行 “搜索和替换” 到另一个字符串。
sed最为核心的功能是增删改查。
(2)sed语法格式和工作流程
语法格式:
sed 选项 ’定位 操作符’ 文件路径
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
# 注:
sed和grep不一样,不管是否找到指定的模式,它的退出状态都是0
只有当命令存在语法错误时,sed的退出状态才不是0
工作流程:
sed 是一种在线的、非交互式的编辑器,它一次处理一行内容。处理时,把当前处理的行存储在
临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完
成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有
改变,除非你使用重定向存储输出,或者使用sed -i选项
-i选项就是将本该输出到屏幕上的内容输出/流入文件中
(3)sed命令的常用选项
表1 sed命令的常用选项
选项 |
功能 |
-e |
表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用 |
-f |
表示用指定的脚本文件来处理输入的文本文件 |
-h |
显示帮助 |
-i |
直接修改目标文本文件 慎用 |
-i.bak |
修改文件时会创建备份文件,防止手误 |
-n |
仅显示script处理后的结果 |
(4)sed命令的操作符
表2 sed命令的操作符
操作符 |
功能 |
s/// |
替换,替换指定字符。 |
d |
删除,删除选定的行。 |
a |
append增加,在当前行下面增加一行指定内容。 |
i |
insert插入,在选定行上面插入一行指定内容。 |
c |
替换,将选定行清除后替换为c后面指定内容。 |
y |
字符转换,转换前后的字符长度必须相同。 |
p |
打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符, 则以 ASCII 码输出。其通常与“-n”选项一起使用。 |
= |
打印行号。 |
l(小写L) |
打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t) |
r |
扩展正则表达式 |
①查操作
根据内容筛选文件信息
根据行号筛查文件信息
② 删除指定内容
表3 删操作
编辑命令 |
含义 |
1d |
删除第1行的内容 |
1,5d |
删除1行到5行的内容 |
2,+5d |
删除第2行以及往下的5行的内容 |
5,$d |
删除5到最后一行行 |
4,6!d |
除了4-6行,其他的全部删除 |
/pattern1/d |
删除每行中匹配到pattern1的行内容 |
/pattern1/,/pattern2/d |
删除匹配到pattern1的行直到匹配到pattern2的所有行内容 |
/pattern1/,/pattern2/!d |
除了pattern1-pattern2的行,其余的全部删除,反向删除 |
/pattern1/,10d |
删除匹配到pattern1的行到10行的所有行内容 |
/pattern1/!d |
除了pattern1的行,其余的全部删除,反向删除 |
10,/pattern1/d |
删除第10行直到匹配到pattern1的所有内容 |
/^$/d |
通过^$,来删除空行 |
![](https://img-blog.csdnimg.cn/ae5374c3723746afa8e925320d45548a.png)
③ 修改文件信息
格式:
行范围 s/旧字符串/新字符串/替换标记
表4 改操作
命令 |
含义 |
1s/old/new/ |
替换第1行内容old为new |
1,10s/old/new/ |
替换1行到10行的内容old为new |
1,+5s/old/new/ |
替换1行到6行的内容old为new |
/pattern1/s/old/new/ |
替换匹配pattern1的内容old为new |
/pattern1/,/pattern2/s/old/new/ |
替换匹配到pattern1的行直到 匹配到pattern2的所有行内容old为new |
/pattern1/,/pattern2/s/old/new/ |
替换匹配到pattern1的行直到 匹配到pattern2的所有行内容old为new |
字母字符进行大小写的替换:
1) 将大写全部转换为小写:
sed 's/[A-Z]/\l&/g' test1.txt
2)把首字母替换成大写
sed 's/[a-z]/\u&/' test1.txt
3)将小写全部转换为大写(末尾加上了一个g)
sed 's/[a-z]/\U&/g' test1.txt
替换指定内容
![](https://img-blog.csdnimg.cn/2b28be85a140498da803f8ad6fdc46da.png)
后向引用
( )内的按顺序标为123 ,引用时\1调用第一个()的内容,\n表示调用第n个()的内容。
.*表示任意长度字符不管是什么字符
's///'查找替换标准格式。
④ 增加内容
表4 增加操作
命令 |
含义 |
a |
行后追加内容 append |
i |
行前追加内容 insert |
r |
读入外部文件,行后追加 |
w |
将匹配行写入外部文件 |
在当前行下面增加一行指定内容
![](https://img-blog.csdnimg.cn/0b380941bb5d481e9482e06d7e135da9.png)
(5)sed命令的打印功能
①查看文件内容
![](https://img-blog.csdnimg.cn/829f0ea6dbe64113a62620ee304a8b2e.png)
② 支持重定向输入
sed '' < /etc/fstab
③ 支持管道符
cat /etc/passwd |sed ''
④ 默认打印方式
1) sed有一个默认输出,加上P,会打印两行:
sed -e 'p' test.txt
2)-n禁止了默认输出,就只有一行:
sed -n 'p' test.txt
(6)sed命令的寻址打印
方式一:按照行号寻求内容
表3 按照行号寻求内容
命令 |
功能 |
sed -n '1p' test.txt |
打印第一行 |
sed -n '4p' test.txt |
打印第四行 |
sed -n '$p' test.txt |
打印最后一行 |
方式二:进行行号范围区间的打印
表4 进行行号范围区间的打印
命令 |
功能 |
sed -n '1,3p' test.txt |
打印1-3行 |
sed -n '5,$p' test.txt |
打印第五行到最后一行 |
sed -n '2,+2p' test.txt |
打印第二行+两行的内容,相当于2,4p |
sed -n '3p;5p' test.txt |
输出第三行和第五行 |
方式三:指定间隔打印
表5 指定间隔打印
命令 |
功能 |
sed -n -e '2p' -e'$p' test.txt |
打印第二行和最后一行 |
sed -n -e '2p' -e'3p' test.txt |
打印第二行和第三行 |
方式四:对奇数行和偶数行的打印
n在p前面,跳过一行,打印下一行,就是偶数行;在后面,就是打印第一行,然后跳过一行,形成奇数行:
表6 对奇数行和偶数行的打印
命令 |
功能 |
sed -n 'n;p' test.txt |
打印偶数的行 |
sed -n 'p;n' test.txt |
打印奇数的行 |
(7)文本模式过滤行内容
方式一:对包含的字符串进行过滤打印
表7 对包含的字符串进行过滤打印
命令 |
功能 |
sed -n '/o/p' test.txt |
包含o的所有行 |
sed -n '/th/p' test.txt |
包含th的所有行 |
方式二:应用基础正则表达式进行打印
表8 应用基础正则表达式进行打印
命令 |
功能 |
sed -n '/^root/p' /etc/passwd |
以root为开头的所有内容,全文本搜索 |
sed -n '/bash$/p' /etc/passwd |
以bash结尾的所有内容,全文本搜索 |
sed -n '4,/bash$/p' /etc/passwd |
从第四行开始,一直打印到第一个以bash为结尾的所在行 |
方式三:使用扩展正则表达式进行打印
注意:
sed -r 支持扩展正则表达式。同时在 使用{n}、{n,}、{n,m}时,括号{}前不需要加反斜杠\ 。
表9 使用扩展正则表达式进行打印
命令 |
功能 |
sed -r -n '/(99:){2,}/p' /etc/passwd |
包含有两个99:的内容所在行 |
sed -r -n '/^root|bash$/p' /etc/passwd |
包换以root开头,或者以bsah结尾的内容所在行 |
(8)sed的查找替换使用
格式:sed '/可使用正则表达式选择范围/'s/查找内容/替换内容/g g表示全文,固定格式的///可以用###等符号替换
注意:查找内容可使用正则表达式,替换内容不可使用正则表达式
二、实验
1.sed命令的寻址打印
(1)查看文件
![](https://img-blog.csdnimg.cn/a5196cf56669429ba99f52cdfc030a8e.png)
(2) 显示默认输出(输出2遍)
sed有一个默认输出,加上P,会打印两行。
![](https://img-blog.csdnimg.cn/5ffdb03dc990449bbadcd9f8ac592659.png)
(3) 不显示默认输出
-n禁止了默认输出,就只有一行
![](https://img-blog.csdnimg.cn/666e94a02cea44c4ba1bf951c709bc92.png)
(4) 打印第二行
![](https://img-blog.csdnimg.cn/bfcc71eb85e04b238ca3b140e3e541a9.png)
(5) 打印最后一行
![](https://img-blog.csdnimg.cn/d9804a4479c742fab776652501c9174c.png)
(6) 只显示行号
![](https://img-blog.csdnimg.cn/c40a75ca7b8b4436b83cbf73ae214123.png)
(7) 显示行号和每行的内容
;表示和
![](https://img-blog.csdnimg.cn/3da82004773b407e860c22068642fd88.png)
(8) 显示1到3行
,表示到
![](https://img-blog.csdnimg.cn/889766d149084c0fbaa48e0353cfb86b.png)
(9) 显示区间
![](https://img-blog.csdnimg.cn/7fb8fcdbc1f54988914b036ef9967454.png)
(10) 分开显示
![](https://img-blog.csdnimg.cn/8535b97b6b4b4be0abefb9bd7adf43f0.png)
(11) 显示第2-4行
![](https://img-blog.csdnimg.cn/5e2fe310a5bd43dfb90f8f7e6b4c3f47.png)
2.显示奇偶
(1)显示奇数(每间隔1个打印一次)
~ 步进,1~2,1个间隔
![](https://img-blog.csdnimg.cn/62e9b582b1904a65a8079e6396c444b3.png)
(2)显示偶数(每间隔2个打印一次)
~ 步进,0~2,2个间隔
![](https://img-blog.csdnimg.cn/a144b9e47361425ca3798776154409b9.png)
(3)显示奇数行
先跳行next ;输出行
![](https://img-blog.csdnimg.cn/f2692d4bf5b04c0a9bfd01b9f371f028.png)
(4)显示偶数行
先输出首行;下一行跳
![](https://img-blog.csdnimg.cn/c2bd06a07f4647babbca3ea00ea53d6f.png)
3.查找替换
(1)以root为开头的所有内容,全文本搜索
![](https://img-blog.csdnimg.cn/c136de4370f247b286dc41a1b618ba98.png)
(2)以bash结尾的所有内容,全文本搜索
![](https://img-blog.csdnimg.cn/7b30ea8b089245429db15ff0121a7436.png)
(3)从第30行开始,一直打印到第一个以bash为结尾的所在行
![](https://img-blog.csdnimg.cn/23df0412a8ef40bf856772105d2a0ed5.png)
(4)使用扩展正则表达式进行打印
包含有两个99:的内容所在行![](https://img-blog.csdnimg.cn/67858adbd76f46339773ad33b370a432.png)
包换以root开头,或者以bsah结尾的内容所在行
![](https://img-blog.csdnimg.cn/c81b0309513344cfae904e4ef3f600aa.png)
4.后向引用
(1)取IP地址
![](https://img-blog.csdnimg.cn/06702e0f5c834bfc9ed78ff214bead3f.png)
(2)反向输出
![](https://img-blog.csdnimg.cn/c56b62b90a904c5c8d07ba4bc0c7b6d7.png)
(3)批量修改扩展名
① 将1行多列内容显示为多行1列
![](https://img-blog.csdnimg.cn/f148a4c82bb643c38635a44bfcc77841.png)
② 将文件后缀名.txt批量 修改为.jpg
![](https://img-blog.csdnimg.cn/d853465a9b574d65848bd8fb7f23e2b3.png)
③ 批量生成用户
![](https://img-blog.csdnimg.cn/7a75028408f748ccb12556608dfcebe5.png)
④ 备份文件
备份
cp /etc/yum.repos.d/CentOS-Base.repo{,.bak}
还原
cp /etc/yum.repos.d/CentOS-Base.repo{.bak,}
5.截取版本号(笔试题)
(1)截取每行版本号
![](https://img-blog.csdnimg.cn/51d93aa30afd43029678d28949311893.png)
(2)脚本截图
![](https://img-blog.csdnimg.cn/29e159ff37ba46de86092ef3c7a7ae97.png)
6.替换IP地址
(1)替换IP地址![](https://img-blog.csdnimg.cn/1686145cf5734db88a4b7afcb584ba9d.png)
(2)替换网关