所在位置:

15个有用的sed命令技巧应用于日常Linux系统管理任务【翻译】

每个管理员每天都要处理纯文本文件。要知道如何查看某些部分,如何替换单词,以及如何从这些文件中过滤内容都是在你不必去查谷歌所必须掌握的技能。

在这篇文章,我们将会回顾一个著名的流编辑器 sed,以及分享使用它的15个技巧,为了更早地完成前面提到的目标,以及更多。

1. 查看文档的一系列行

比如 head 和 tail 工具允许我们查看地一个文件的底部或者顶部。如果我们想看一下中间那一部分呢?下面的 sed 单行将会从 myfile.txt 文件返回 5 到 10 行。

# sed -n '5,10p' myfile.txt

2. 查看除给定范围的整个文件

另一个方面,可能你想打印除了给定范围的整个文件。从 myfile.txt 文件中排除 20 到 35 行可以这样做:

# sed '20,35d' myfile.txt

3. 查看没有连续的行和范围

你可能会对一组不连续的行或者多个范围感兴趣。让我们从 myfile.txt 显示 5 到 7 行 和 10 到 13 行:

# sed -n -e '5,7p' -e '10,13p' myfile.txt

就好像你能看到的,这个 -e 选项允许为每一个范围去执行给定的动作(在这里,打印行)。

4. 替换单词或者字符串(基本替换)

为了在 myfile.txt 文件中用 story 来替换每一个 version 单词的实例,可以这样做:

# sed 's/version/story/g' myfile.txt

另外,你可能还要考虑使用 gi 来替换 g 来忽略字符串大小写:

# sed 's/version/story/gi' myfile.txt

为了用一个空格来替换多个空格,我们将使用 ip route show 和管道的输出:

# ip route show | sed 's/  */ /g'

比较有管道和没有管道的 ip route show 输出:

5. 替换在范围内的单词或者字符串

如果你只希望在一行的范围内(例如:30 到 40 行)替换单词有兴趣,你可以这样做:

# sed '30,40 s/version/story/g' myfile.txt

当然,你可以通过相应的数字替换范围来指定一行

6. 使用正则表达式(高级替换)- 第一部分

有时配置文件会加载注释。如果你想第一眼看到他们,那么对于仅仅显示配置的指令可能有用的。

为了移除Apache配置文件的空行或者以 # 开头的行,你可以这样做:

# sed '/^#\|^$\| *#/d' httpd.conf

跟在数字符号(^#) 之后的插入符表示是行的开头,就好像 ^$ 表示空白行。垂直条表示布尔操作,而反斜杠用于转义垂直条。

在特殊的情况下,Apache 配置文件有些行不是以 # 开头的,因此 *# 同样可以移除掉它们。

7. 使用正则表达式(高级替换)- 第二部分

为了用另外一个单词来替换以大写或者小写开头的单词,我们也可以使用 sed。为了说明,让我们在 myfile.txt 文件中用 rar 来替换 zip 或者 Zip 这个单词:

# sed 's/[Zz]ip/rar/g' myfile.txt

不要错过: 使用 awk 的正则表达来过滤文件的内容

8. 用给定的模式来查看包含的行

sed 的另一个用途是来打印在文件中匹配给定的正则表达式的行。例如,你可能有兴趣查看在 CentOS 7 服务上每一个 /var/log/secure 日志文件发生在 7月2号的授权和身份认证活动。

在这种情况下,这种模式就会查找以7月2号开头的每一行:

# sed -n '/^Jul  1/ p' /var/log/secure

说明: 上面的 Jul 1 写错了,应该是 Jul 2

9. 在文件中插入空白行

我们能用 sed 给文件的每一个非空行来插入空格(空白行)。为了在 LICENSE 纯文本文件中给每一行都插入一行空白行,你可以这样做:

# sed G myfile.txt

为了插入两行空白行,你可以这样做:

# sed 'G;G' myfile.txt

如果你想添加更多的空白行,可以添加用分号分隔的大写G。下面的图片显示了本技巧中概述的示例:

如果你想检查大型的配置文件,这个技巧可能更方便。在每一行中插入空白行和用管道输出得少点将会带来友好的阅读体验。

10. 通过内部编辑来模拟 dox2unix

这个 dos2unix 程序可以把纯文本文件从 Windows/Mac 格式成 Unix/Linux,删除在这些平台上使用的文本编辑器插入的隐藏换行符。如果在你的 Linux 系统没有安装,你可以用 sed 来模拟它的功能,而不是安装它。

在这个图片的左边我们可以看到一些 DOS 的换行符(^M),这个换行符我们之后可以把它删除:

# sed -i 's/\r//' myfile.txt

请注意这个 -i 选项表示就地编辑。之后的变化将不会返回给屏幕,但是将会保存到文件。

注意:当你正在用 vim 编辑器编辑文件 的时候,可以用 Ctrl + V 和 Ctrl + M 来插入 DOS 换行符。

11. 就地编辑和备份原始文件

在之前的技巧中我们使用 sed 来修改文件但是没有保存原始的文件。有时保存备份原始文件的一个副本来以防万一是一个好的主意。

为了这样做,指定在 -i 选项(在单引号里面)后面的的后缀将会被用来重命名原始的文件。

在下面的例子中我们将会替换所有在 myfile.txt 的 this 或者 This(忽略大小写)的实例,以及我们将会保存原始的文件为 myfile.txt.orig。

最后,我们将会使用不同的 工具 来区分这两个文件的不同点:

# sed -i'.orig' 's/this/that/gi' myfile.txt

12. 交换一对单词

让我们假设你有一个由姓和名格式成全名的文件。为充分地处理文件,你可能想交换姓和名。

你可以用 sed 相当容易地做到:

# sed 's/^\(.*\),\(.*\)$/\2\, \1/g' names.txt

从上面的图中我们可以看到这个括号是一个需要被转义的特殊字符,数字 1 和 2 也是如此。

被高亮的这些数字代表的是正则表达式(需要在括号里出现的)

  • 1 表示每一行逗号的开始

  • 2 是占位符表示逗号的最后一行

这个希望输出的格式是第二栏(姓氏) + , + + 第一栏(名字)。随便你想改成怎么样的。

13. 仅在发现单独的匹配时才替换单词

有时替换所有的给定单词的实例或者随机几个实例都不是我们想要的。也许我们需要执行发现单独的匹配时才替换。

例如,如果在同一行中有几个单词 services 被匹配了,我们才想用 stop 来替换 start。在这样情况下,将会发生什么:

We need to start partying at work,
but let’s remember to start all services first.

在第一行,start将不会被 stop 替换,因为单词 services 没有出现在这一行,相反就出现在了第二行。

# sed '/services/ s/start/stop/g' msg.txt

14. 一次执行两个或者更多的替换

你可以在单行的 sed 命令中组合两个或者更多的替换。让我们在 myfile.txt 中用 This 和 verse 来替换这些对应的单词。

请注意,如何使用普通的sed替换命令,后跟分号和第二个替换命令来完成此操作:

# sed -i 's/that/this/gi;s/line/verse/gi' myfile.txt

下面这张图片说明了这个技巧:

15. 组合 sed 和其它命令

当然,sed 可以组合其它的工具来创建更强大的命令。例如,让我们使用 技巧 4 的例子和从 ip route 命令的输出中提取出我们的 IP 地址。

我们一开始将会打印仅仅有 src 这个单词的行。然后我们将会把多个空格转换为一个。最后,我们将 IP 地址第 9 个字段(假设一个空格为了一个分隔符)

# ip route show | sed -n '/src/p' | sed -e 's/  */ /g' | cut -d' ' -f9

下面这个图片将会说明上面命令的每一步:

总结

在这个指南中,我们分享了 15 个 sed 技巧来帮助你日常的系统管理任务。是否有任何其他小贴士经常使用,并希望与我们和社区的其他成员分享?

如果是这样的话,你可以使用下面的评论让我们知道。问题和意见都是欢迎的 - 我们期待你的回音!

不要错过:掌握 AWK 命令的技巧

原文

【上一篇】sed的基本用法

【下一篇】sed进阶