表面上看,Unix流编辑器(sed)可能看上去只是一个温和的文本编辑器。但是在它平静的外表之下有着强大的功能,可以作为高级功能来帮助管理你的数据中心资源,而你只用敲击几个键。这篇文章就将为你揭开sed中某些强大功能的神秘面纱。
sed案例
为什么是sed呢?像vi一样的普通编辑器也可以修改文本文件。不同在于sed同时处理多个文件时更高效。用其它编辑器以同一途径过滤文本的能力是个未知数。sed的默认行为是逐行地初查输入文件,将命令应用到这些行上并将结果写入标准输出。为了执行这些命令,sed使用正则表达式。下面让我们来看看Listing 1中你能看到的应用到文件Users的例子:
my-computer:~> cat users
lori:x:1006:100::/home/lori:/bin/bash
linda:x:1007:100::/home/linda:/bin/bash
lydia:x:1008:100::/home/lydia:/bin/bash
lisa:x:1009:100::/home/lisa:/bin/bash
leonora:x:1010:100:/home/leonora:/bin/bash
Listing 1
为了启动,你可以只显示示例文件中的几行,下面的命令显示头两行省下了后面的:
sed 2q users
更实用的是下面的命令,它列出了包括or字符串在内的所有行:
sed -n /or/p users
在这个例子中,-n是or搜索字符串后的强制选项。在这个字符串后面,p命令列出结果。在这个例子中,你已经查询了or字符串。sed使用正则表达式,这个强大的搜索模式可以在Linux和Unix环境中使用,它能让你的搜索更灵活。下面是使用正则表达式的一些例子:
sed -n /^or/p users:显示不包括文本or的所有行。
sed -n /./p users: 显示至少包括一个字符的所有行。
sed -n /\./p users:显示有.的所有行。
仅仅列出行并不是让sed如此强大的地方,你还可以替换字符。下面的命令概括了该语法:
sed s/leo/lea/g users
该命令用字符串lea替换了leo,并将结果写入标准输出。将它写入标准输出非常安全,但是它不会将任何变更应用到文件。要做变更,在命令中添加-i选项。
sed -i s/leo/lea/g users
这些变更即刻应用,如果你明白自己在做什么,这是很有用的。如果你对sed仍然动摇,先将结果发送到标准输出,因此你就可以在编写它之前检查了。
你可以通过sed的shell脚本功能发挥它的全部力量。例如,如果你有四个文件,在现有的目录中命名为file1、file2、file3和file4,而你需要将每个文件中的文本one替换为文本ONE。以下的脚本行将执行这个任务:
for i in file[1-4]; do sed -i s/one/ONE/g $i; done
想像一下数据中心中sed的力量:例如,你可以变更包含刚刚替换的存储设备ID的所有配置文件,或者你可以修改一个模板文件来确保__服务的名字替换成了你正使用服务的真实名称。sed的可能性是无限的。
【编辑推荐】