Linux 三剑客之 Sed

Sed 是一种新型的、非交互式的编辑器。它能执行与编辑器 vi 和 ex 相同的编辑任务。Sed 编辑器没有提供交互式使用方式,使用者只能在命令行输入编辑命令、指定文件名,然后在屏幕上查看输出。Sed 编辑器没有破坏性,它不会修改文件,除非使用 Shell 重定向来保存输出结果。默认情况下,所有的输出行都被打印到屏幕上。

1、Sed 命令

1.1 Sed 工作过程

Sed 编辑器逐行处理文件(或输入),并将输出结果发送到屏幕。Sed 把当前正在处理的行保存在一个临时缓存区中,这个缓存区称为模式空间或临时缓冲。Sed处理完模式空间中的行后(即在该行上执行 Sed 命令后),就把该行发送到屏幕上(除非之前有命令删除这一行或取消打印操作)。Sed 每处理完输入文件的最后一行后,Sed 便结束运行。Sed 把每一行都存在临时缓存区中,对这个副本进行编辑,故不会修改或破坏源文件。下图所示为 Sed 处理过程。

从上图可以看出 Sed 不是破坏性的,它不会修改正在编辑的文件。

1.2 Sed 命令格式

Sed 命令行格式为:Sed [选项] ‘commamd’ 输入文本

1.3 报错信息和退出信息

遇到语法错误时,Sed 会向标准错误输出发送一条相当简单的报错信息。如果 Sed 判断不出错在何处,它会“断章取义”,给出令人迷惑的报错信息。如果没有语法错误,Sed将会返回给 Shell 一个退出状态,状态 0 代表成功,为非 0 整数代表失败。

2、Sed 范例

2.1 Sed 测试实例

下面这组范例展示了如何使用 Sed,包括如何使用它的选项、命令和正则表达式。记住 Sed 不是破坏性的,它不会修改正在编辑的文件,除非重定向它的输出结果。下面给出测试文件 sed.txt 作为输入文件。

2.2 打印:p 命令

命令 p 是打印命令,用于显示模式缓存区的内容。默认情况下,Sed 把输入行打印在屏幕上,选项 -n 用于取消默认打印操作。当选项 -n 和命令 p 同时出现时,Sed 可打印选定的内容,EG 1:

备注:默认情况下,Sed 把所有输入行都打印在标准输出上。如果在某一行匹配到 north,Sed 就把该行另外打印一遍,EG 2:

默认情况下,Sed 打印当前缓存区中的输入行。命令 p 指示 Sed 将再次打印该行。选项 -n 取消 Sed 默认打印操作。选项 -n 和命令配合使用,模式缓冲区内的输入行,只被打印一次。如果不指定 -n 选项,Sed 就会像上例中那样,打印出重复的行。如果指定了 -n,则 Sed 只打印包含模式 north 的行。

2.3 删除:d 命令

命令 d 用于删除输入行。Sed 先将输入行从文件复制到模式缓冲区,然后对该行执行 Sed 命令,最后将模式缓存区的内容显示在屏幕上。如果发出的是命令 d,当前模式缓存区的输入行会被删除,不被显示。EG 3:

备注:删除第 3 行。默认情况下,其余的行都被打印到屏幕上。

EG 4:

备注:删除从第三行到最后一行内容,剩余各行被打印。地址范围是开始第 3 行,结束最后一行。

EG 5:

备注:所有包含模式 north 的行都被删除,其余行被打印。

2.4 替换:s 命令

命令 s 是替换命令。替换和取代文件中的文本可以通过 sed 中的 s 来实现,s 后包含在斜杠中的文本是正则表达式,后面跟着的是需要替换的文本。可以通过 g 标志对行进行全局替换。

EG 6:

备注:s 命令用于替换。命令末端的 g 表示在行内全局替换;即如果每一行里出现多个 west,所有的 west 都会被替换为 north。如果没有 g 命令,则只将每一行的第一 west 替换为 north。

EG 7:

备注:s 命令用于替换。选项 -n 与命令行末尾的标志 p 结合,告诉 sed 只打印发生替换的那些行;即如果只有在行首找到 west 并替换成 north 时才会打印此行。

EG 8:

备注:当“与”符号(&)用在替换串中时,它代表在查找串中匹配到的内容时,进行相关操作。在该示例中所有以 2 位数结尾的行后面都被加上 .5。

EG 9:

备注:文件中出现的所有的 Hemenway 都被替换为 Jones,只有发生变化的行才会打印出来。选项 -n 与命令 p 的组合取消了默认的输出。标志 g 的含义是表示在行内全局替换。

EG 10:

备注:包含在圆括号里的模式 Mar 作为标签 1 保存在特定的寄存器中。替换串可以通过 \1 来引用它。则Margot 被替换为 Marlinane。

EG 11:

备注:紧跟在 s 命令后的字符就是查找串和替换串之间的分隔符。分隔符默认为正斜杠,但可以改变。无论什么字符(换行符,反斜线除外),只要紧跟在 s 命令,就成了新的串分隔符。这个方法在查找包含正斜杠模式时很管用,例如查找路径名或生日。

2.5 指定行的范围:逗号

行的范围从文件中的一个地址开始,在另一个地址结束。地址范围可以是行号(例如5,10),正则表达式(例如/Dick/和/Joe/),或者两者的结合(例如/north/,$)范围是闭合的——包含开始条件的行,结束条件的行,以及两者之间的行。如果结束条件无法满足,就会一直操作到文件结尾。如果结束条件满足,则继续查找满足开始条件的位置,范围重新开始。

EG 12:

备注:打印模式 west 和 east 之间所有的行。如果 west 出现在 east 之后的某一行,则打印的范围从 west 所在行开始,到下一个出现 east 的行或文件的末尾(如果前者未出现)。即图中 northwest 和 southeast 之间的范围。

EG 13:

备注:打印从第 5 行开始第一个以 northeast 开头的行之间的所有行。

EG 14:

备注:修改从模式 west 和 east 之间的所有行,将各行的行尾($)替换为字符串**VACA**。换行符被移到新的字符串后面。

2.6 多重编辑:e 命令

-e 命令是编辑命令,用于 sed 执行多个编辑任务的情况下。在下一行开始编辑前,所有的编辑动作将应用到模式缓存区的行上。

EG 15:

备注:选项 -e 用于进行多重编辑。第一重编辑删除第 1~3 行。第二重编辑将 Hemenway 替换为 Jones。由于是逐行进行这两行编辑(即这两个命令都在模式空间的当前行上执行),故编辑命令的顺序会影响结果。例如,如果两条命令都执行的是替换,前一次替换会影响后一次替换。

2.7 追加:a 命令

a 命令是追加命令,追加将新文本添加到文件中当前行(即读入模式的缓存区行)的后面。不管是在命令行中,还是在 Sed 脚本中,a 命令总是在反斜杠的后面。

EG 16:

备注:命令 a 用于追加。字符串 Hello, World!被加在以 north 开头的各行之后。如果要追加的内容超过一行,则除最后一行外,其他各行都必须以反斜杠结尾。

2.8 插入:i 命令

i 命令是插入命令,类似于 a 命令,但不是在当前行后增加文本,而是在当前行前面插入新的文本,即刚读入缓存区模式的行。

EG 17:

备注:命令 i 是插入命令。如果在某一行匹配到模式 eastern,i 命令就在该行的上方插入命令插入反斜杠后面后的文本,除了最后一行。

2.9 修改:c 命令

c 命令是修改命令。Sed 使用该命令将已有的文本修改成新的文本。旧文本被覆盖。

EG 18:

备注:c 命令是修改命令。该命令将完整地修改在模式缓冲区行的当前行。如果模式 eastern 被匹配,c 命令将其后的文本替换包含 eastern 的行。

2.10 获取下一行:n 命令

n 命令表示下一条命令。Sed 使用该命令获取输入文件的下一行,并将其读入到模式缓冲区中,任何 Sed 命令都将应用到匹配行紧接着的下一行上。

EG 19:

备注:如果在某一行匹配到模式 eastern,n 命令就指示 Sed 用下一个输入行(即包含 AM Main Jr 的那行)替换模式空间中的当前行,并用 Archie 替换 AM,然后打印该行,再继续往下处理。

2.11 转换:y 命令

y 命令表示转换。该命令与 tr 命令相似,字符按照一对一的方式从左到右进行转换。例如 y/abc/ABC/,会把小写字母转换成大写字母,a–>A,b–>B,c–>C。

EG 20:

备注:y 命令把 1~3 行中所有的小写命令字母都转换成了大写。正则表达式元字符对 y 命令不起作用。与替分隔符一样,斜杠可以被替换成其他字符。

2.12 退出:q 命令

q 命令表示退出命令。该命令将导致 Sed 程序退出,且不再进行其他的处理。

EG 21:

备注:打印完第 5 行之后,q 让 Sed 程序退出。

EG 22:

备注:在某行匹配到模式 Lewis 时,s 表示先用 Joseph 替换 Lewis,然后 q 命令让 Sed 退出。

3、生产环境案例

3.1 使用 Sed 命令取出 IP 地址

在实际生产中,在修改配置文件的时候,有一些空格、空行、带“#”开头的注释都要删除或替换,下面介绍几个实用的例子。

EG 23:

从 Google 上下载下来的配置文件往往都带有数字,现在需要删除所有行的首数字。

EG 24:

4、总结

本文总结了 Sed 命令的用法,前面部分是 Sed 命令的语法,后面部分则主要以实际案例来说明 Sed 的用法,最后面一点介绍了 Sed 命令在生产实践中的运用。所谓学为练,练为站。Awk + Sed 组合在频繁的分析日志文件工作中发挥重要的作用。想要融会贯通仍需在工作中实践、反思、总结、再实践,以此反复,才能达到融会贯通的效果。

发表评论

电子邮件地址不会被公开。 必填项已用*标注