Shell编程之sed

一、概念

(1)sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
(2)sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。

二、工作流程

sed 的工作流程主要包括读取、执行和显示三个过程:
读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
执行:默认情况下,所有的sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed 命令 将会在所有的行上依次执行。
显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。

在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

注:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。

三、命令格式

格式

格式一:
sed [选项] '操作' 文件1  文件2...

格式二:
sed [选项] '选项{
操作1
操作2
...
}' 文件1  文件2...

常用选项

-e 或--expression=:表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用
-f 或--file=:表示用指定的脚本文件来处理输入的文本文件。
-h 或--help:显示帮助。
-n、--quiet  silent:禁止sed编辑器输出,但可以与p命令一起使用完成输出。
-i:直接修改目标文本文件。

常用操作

s:替换,替换指定字符。
d:删除,删除选定的行。
a:增加,在当前行下面增加一行指定内容。
i:插入,在选定行上面插入一行指定内容。
c:替换,将选定行替换为指定内容。
y:字符转换,转换前后的字符长度必须相同。
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。
=:打印行号。
l(小写):打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)

四、sed命令的使用

实验创建的文件,下面演示的用的都是以下文件
文件1
文件2

打印

打印完整内容
sed -n 'p' 文件

打印1

显示行号
sed '=' 文件
sed -n '=' 文件

打印2

打印不显示的ASCII字符
sed -n 'l' 文件

打印3

同时执行多条命令
sed -n '=;p' 文件

sed -n -e '=' -e 'p' 文件

sed -n '
> =
> p
> ' 文件

打印4
打印5

使用地址

sed编辑器有2种寻址方式:
(1)以数字形式表示行区间
(2)用文本模式来过滤出行

打印第一行(这里“1p”是数字1
sed -n '1p' 文件

打印最后一行
sed -n '$p' 文件

打印13
sed -n '1,3p' 文件

打印3到最后一行
sed -n '3,$p' 文件

打印6

打印1之后的连续3行,即1-4
sed -n '1,+3p' 文件

输出前3行信息后退出,q表示退出
sed '3q' 文件

打印奇数行
#第一步:sed读取第一行,p打印出来
#第二步:这里n表示移动到下一行(此时是第二行)
#第三步:sed命令结束,再次切换到下一行(此时是第三行)
#第四步:重复一二三的步骤,直至最后一行
sed -n 'p;n' 文件

打印偶数行,和上面的步骤差不多
sed -n 'n;p' 文件

从第2行开始执行n和p的操作,也是奇数行
sed -n '2,${n;p}' 文件

打印7

/etc/passwd文件中过滤出含有root的行,并打印出来,注意大小写
sed -n '/root/p' /etc/passwd

/etc/passwd文件中打印以‘r’开头的行,注意大小写
sed -n '/^r/p'  /etc/passwd

/etc/passwd文件中打印以‘bash’结尾的行,注意大小写
sed -n '/bash$/p' /etc/passwd

打印文件里包含ftp和root的行
sed -n '/ftp\|root/p' /etc/passwd

从第二行开始打印到包含nobody的行
sed -n '2,/nobody/p' /etc/passwd

-r表示支持正则表达式
sed -nr '/ro{1,}t/p' /etc/passwd

打印8

删除

全删
sed 'd' 文件

删除第三行
sed '3d' 文件

删除24
sed '2,4d' 文件

删除最后一行
sed '$d' 文件

删除以e结尾的行
sed '/e$/d' 文件

除了e结尾的都删了,“!”表示取反操作
sed '/e$/!d' 文件

删除1

删除空行
sed '/^$/d' 文件

从第一个位置打开行删除功能,到第二个位置关闭行删除功能,按行删除(慎用)
sed '/1/,/b/d' 文件

删除2

替换

格式:
sed [选项] '行范围 s/旧字符串/新字符串/替换标记'

4种替换标记:
数字:表明新字符串将替换第几处匹配的地方
g:表明新字符串将会替换所有匹配的地方
p:打印与替换命令匹配的行,与-n一起使用
w 文件:将替换的结果写到文件中
将每行的第一个root替换成admin
sed -n 's/root/admin/p' /etc/passwd

将每行的第二个root替换成admin
sed -n 's/root/admin/2p' /etc/passwd

将每行的所有root替换成admin
sed -n 's/root/admin/gp' /etc/passwd

将每行的所有root删除
sed 's/root//g' /etc/passwd

替换1

1-5行行首添加#
sed '1,5 s/^/#/' /etc/passwd

替换2

在以root开头的行的结尾添加#
sed '/^root/ s/$/#/' /etc/passwd

替换3

vim script.sed      #创建一个用于sed命令的脚本,以sed结尾方便辨识           
s/1/123/             #1替换成11,下面以此类推
s/c/k/
sed -f script.sed 文件

替换4

/etc/passwd中的1-5行输出保存到out.txt文件中
sed -n '1,5w out.txt' /etc/passwd

/etc/passwd 中的1-10行的开头添加#后保存到put.txt文件中
sed -n '1,10 s/^/#/w put.txt' /etc/passwd

替换5

/bin/bash替换成/bin/csh
sed -n 's/\/bin\/bash/\/bin\/csh/p' /etc/passwd #“\”是转义字符,用来取消“/”的特殊意义

sed -n 's!/bin/bash!/bin/csh!p' /etc/passwd		#使用“!”作为字符串分隔符

替换6
注:s 后面跟的符号就是替换符,若出现相同符号要用 \ 转义

插入

将内容有1的行,整行替换为ABC
sed '/1/c ABC' 文件

将内容11装换为QQ,注意使用“y”时需要转换前后的字符长度必须相同
sed '/11/ y/11/QQ/' 文件

插入1

1-3行,每行的下面都插入A1
sed '1,3a A1' 文件

在第一行的上面插入ABC
sed '1i ABC' 文件

在最后一行下插入ABC
sed '$a ABC' 文件

在第3行后导入文件内容
sed '3r /etc/resolv.conf' 文件

插入2

将包含root的行剪切到末尾,H表示复制到剪切板,G表示粘贴到指定行后
sed '/one/{H;d};$G' 文件

12行复制到34行的下面,注意第三行和第四行都会复制12两行的内容
sed '1,2H;3,4G' 文件

插入3

将字符111222交换位置
echo  "111222333" | sed -r 's/(111)(222)/\2\1/'

插入4

将第一个字符和最后一个字符互换
echo  "111222333" | sed -r 's/^(.)(.*)(.)$/\3\2\1/'

插入5

总结

掌握sed编辑器的使用方法,与vim编辑器有些功能相似,与正则表达式结合使用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
命令格式 9 一.shell与Unix平台 9 二.shell基本知识 9 三.grep 命令 11 四.sed 11 五.awk命令 11 六.find命令 12 七.test命令 12 八.expr命令 13 九.流程控制语法 13 1 if then elif else fi语句 13 4 for语句 15 6 while语句 16 7 until 语句 17 8 break及continue 18 9 case 语句 18 十.shell脚本调试 19 实例讲解 21 一.模式匹配 21 1.ls显示所有以hosts 开头的文件 21 2.ls显示包含x y z字符的所有文件 21 二.正则表达式 21 1.grep匹配 etc services文件以ftp字符串开头的哪些文本行 21 2.grep匹配以system文本结尾的行 21 3.grep匹配仅包含一个#字符的行 21 4.grep匹配以<abc>或者[abc]开头的行 21 5.grep匹配以Ftp或者ftp开头的行 21 6.grep匹配F或者f以外的字符 21 7.grep匹配除大写字符以外的字符 21 8.grep匹配以ftp或telnet开头的文本行 21 9.grep匹配以ftp开头 后跟0个或多个 agent的文本行 21 10.grep匹配以ftp开头 后跟1个或多个 agent的文本行 21 11.grep匹配带有数字6 后跟至少3个0的文本行 使用 E启用边界特性 22 12.grep匹配含有 abc 的文本 22 13.常用正则表达式举例 22 14.grep精确匹配:在抽取字符串后加 > 23 15.grep消除大小写:加入 i选项 23 16.特殊字符:$ ‘ “ [ ] ^ | + 23 17.grep判断变量含有[HOST]字符串 23 18.grep判断变量含有[xxx]字符串 23 19.grep匹配后缀为c h j s cpp hpp的文件 23 20.使用grep在文件查找变量 23 21.正则表达式语法 23 三.sed命令 27 1.sed文本的定位方法: 27 2.sed编辑命令 27 3.sed打印文件的第二行 27 4.sed打印文件的第一到三行 27 5.sed打印匹配test的行 28 6.sed打印匹配$的行 28 7.sed打印最后一行:$是代表最后一行的特殊字符 28 8.sed脚本文件 28 9.sed上例如果将a 改为i: 28 10.sed上例如果将a 改为c: 28 11.sed删除第一行 28 12.sed删除第一到第三行 28 13.sed删除最后一行 28 14.sed替换文本 28 15.sed输出到文件 w选项: 28 16.sed文件读取 r选项: 28 17.sed优势: 28 18.sed常见的一行命令集 29 19.sed去掉字串变量前后的空格 29 20.sed去除文件count的前后的空格 29 21.sed提取最后一个目录名和程序名 30 22.dirname或参数扩展提取目录名 30 23.grep sed获取文件的扩展名 31 24.sed获取第n个匹配的行的行号 31 四.awk命令 31 1.awk字段分隔符: 31 2.awk匹配模式 32 3.awk“模式匹配-动作” 32 4.awk内部变量 32 5.awk用户定义变量 32 6.awk算术运算 33 7.awk高级算符 33 8.awk内部算术函数 33 9.awk内置函数 33 10.awk的自定义函数 34 11.awk的“下一”语句: 35 12.awk的字符串相加: 35 13.awk的逻辑运算符 35 14.awk的逻辑与|| 逻辑或&& 35 15.awk的FS OFS和ORS使用: 35 16.awk的sprintf函数的使用 36 17.awk的重定向 输出到文件: 36 18.awk删除文件的第一行 36 19.awk删除输入行特定行的换行字符 36 20.awk获取输入行 域的最大个数 36 21.awk输出一行超过80 个字符的每一行 36 22.awk输出至少一个域的所有行 可用来将一个文档里的所有空白行删除 36 23.awk输出范围在0 到100 之间的7 个随机数 36 24.awk将所有用户的login名称依照字母的顺序输出 36 25.awk将一个文档的总行数输出 36 26.awk输出文档的内容时会在每行的最前面输出行号它的功能与"cat n" 类似 36 27.awk自定义函数的例子一: 第一个域与第二个域的平方和 37 28.awk的split 数组 注释 37 29.awk打印传入字符串的第n个分隔域 37 30.在awk使用shell的变量 37 31.在某个目录下查找包含特定字符串的文件 返回文件名称 39 五.其它命令 39 1.eval命令:可用于动态生成和执行代码 39 2.exit n:退出 40 3.export导出环境变量: 41 4.shift命令: 41 5.shell的参数扩展: 41 6.<<即时文档 42 7.sh调试选项 42 8.time命令测试一个程序执行时间 42 9.expr命令 42 10.if语句判断变量是否为某个值(防止空串) 43 11.nm命令察看一下xxx o文件是否有多个相同名字的函数 43 12.ps grep和awk显示属于某个用户的所有进程(并杀死) 43 13.touch命令 43 14.touch与make联合使用强制编译 44 15.dd命令传送文件 44 16.talk命令 44 17.ps命令 44 18.rm指令 44 19.find命令 44 21.rusers命令 45 22.cal命令 45 23.tty命令 45 24.banner命令 45 25.find命令 45 26.cut命令 45 27.paste命令 46 28.rm命令 47 29.mkdir命令 47 30.cat命令 48 32.groupadd和mkgroup命令 48 33.ln命令 48 34.su命令 49 35.setenv命令 49 36.repeat命令 49 37.getopts命令 49 38.sort命令 50 38.kill命令和trap命令 50 39.操作系统和数据库检查(IBM)(一):检查核心参数的配置 51 40.操作系统和数据库检查(IBM)(二):检查时区的配置 52 41.操作系统和数据库检查(IBM)(三):检查硬件错误 52 42.操作系统和数据库检查(IBM)(四):检查硬盘错误 52 43.操作系统和数据库检查(IBM)(五):检查交换区的使用情况 52 44.操作系统和数据库检查(IBM)(六):检查内存的使用情况 52 45.操作系统和数据库检查(IBM)(七):检查系统的运行情况 52 46.操作系统和数据库检查(IBM)(八):检查文件系统的使用情况 52 47.操作系统和数据库检查(IBM)(九):检查文件系统的属性 53 48.操作系统和数据库检查(IBM)(十):HACMP检查 53 49.操作系统和数据库检查(IBM)(十一):检查数据库的DR状态 53 50.操作系统和数据库检查(IBM)(十二):检查数据库的运行状态 54 51.操作系统和数据库检查(IBM)(十三):数据库检查 55 52.操作系统和数据库检查(IBM)(十四):检查数据库的运行日志 55 53.fsck命令 55 54.useradd和mkuser命令 56 54.exec命令 56 54.tr命令 56 六.杂项 57 1.setenv PATH和set path 57 2.awk输出单引号 57 3.awk或read找出文件行字符数大于80的行 57 4.shell脚本程序的用户切换: 57 5.shell删除文件且不显示输出信息和出错信息 58 6.shell变量赋初值时存在特殊字符 58 7.sed的参数串存在 特殊字符 58 8.find在一个目录下找包含一个字符串的所有文件 58 9.shell确定一个文件的存在 文件ins billdb 58 10.read的参数与实际域的个数不同 58 11.grep获取主机名和IP地址 59 12.grep确定变量不是数字 60 13.确定字符串是否是ip地址 60 15.grep和awk列出某个目录下的一级子目录 61 16.用printf将一个数打印成逗号分隔的形式 61 17.iTELLIN示例一:在ksh使用数组 62 18.iTELLIN示例二:从文件读取参数: 63 19.iTELLIN示例三:包含其它脚本文件 64 20.iTELLIN示例四:初始化一个临时文件供使用 65 21.iTELLIN示例五:分解字符串 65 22.iTELLIN示例六:替换配置文件的值 66 24.iTELLIN示例八:用另外的文件作为函数库 67 25.iTELLIN示例九:解压缩文件到一个目录 68 26.iTELLIN示例十:判断操作是否成功 70 27.iTELLIN示例十一:封装创建一个组的函数 71 28.iTELLIN示例十二:封装创建一个用户的函数 72 29.iTELLIN示例十三:判断一个字符串是否是正整数 74 30.iTELLIN示例十四:判断当前用户是否有root权限 75 31.iTELLIN示例十五:判断一个字符串是否是整数 75 32.iTELLIN示例十六:删除某个文件夹下若干天以来未改动的文件 76 33.各种Unix环境对ksh的影响: 76 34.set 使用注意点: 77 35.判断对端节点的文件是否存在: 77 36.awk的split函数的使用: 77 37.统计字符串在文件出现的次数: 77 38.如何进行精确匹配: 81">命令格式 9 一.shell与Unix平台 9 二.shell基本知识 9 三.grep 命令 11 四.sed 11 五.awk命令 11 六.find命令 12 七.test命令 12 八.expr命令 13 九.流程控制语法 13 1 if then elif else fi语句 13 4 for语句 15 6 while语句 16 7 until 语句 17 8 br [更多]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值