网站搜索

Linux 系统管理任务的 15 个 Sed 命令提示


每个系统管理员每天都必须处理纯文本文件。了解如何查看某些部分、如何替换单词以及如何从这些文件中过滤内容是您需要掌握的技能,而无需进行 Google 搜索。

在本文中,我们将回顾著名的流编辑器 sed,并分享使用它来实现前面提到的目标等的 15 个技巧。

什么是 sed 命令?

sed”命令是流编辑器的缩写,是一种多功能且功能强大的文本操作工具,可在文本流上运行,允许用户对数据执行各种操作,例如搜索、替换、插入和删除数据。删除。 “Sed”使用正则表达式来定义文本操作的模式,它可以用于批量编辑任务和脚本中的文本处理。

其显着功能之一是就地编辑,可以直接修改文件或在进行更改时创建备份副本。 “Sed”是系统管理员、程序员以及任何在命令行中处理文本转换和数据操作任务的人的必备工具。

以下是一些常见的“sed”命令及其示例:

1. 查看文件的行范围

head 和 tail 等工具允许我们查看文件的底部或顶部。如果我们需要查看中间的部分怎么办?以下 sed 单行语句将从 howtoing.txt 返回第 510 行:

sed -n '5,10p' tecmint.txt

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

另一方面,您可能想要打印除特定范围之外的整个文件。要从 howtoing.txt 中排除 2035 行,请执行以下操作:

sed '20,35d' myfile.txt

3. 查看非连续线和范围

您可能对一组不连续的线或多个范围感兴趣。让我们显示 howtoing.txt 中的 5-710-13 行:

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

正如您所看到的,-e 选项允许我们为每个范围执行给定的操作(在本例中为打印行)。

4. 替换文件中的单词或字符串

要将 howtoing.txt 中单词 version 的每个实例替换为 story,请执行以下操作:

sed 's/version/story/g' tecmint.txt

此外,您可能需要考虑使用 gi 而不是 g 以忽略字符大小写:

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

要将多个空格替换为一个空格,我们将使用带有管道的命令 ip route show 的输出:

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

比较使用和不使用管道时 ip route show 的输出:

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

如果您只想替换行范围内的单词(例如 3040),您可以执行以下操作:

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

当然,您可以通过相应的数字而不是范围来指示单行。

6. 从文件中删除注释

有时配置文件会加载注释。虽然这确实很有用,但如果您想一目了然地查看所有配置指令,有时仅显示配置指令可能会有所帮助。

要从 Apache 配置文件中删除空行或以 # 开头的行,请执行以下操作:

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

插入符号后跟数字符号 (^#) 表示行的开头,而 ^$ 表示空行。竖线表示布尔运算,而反斜杠用于转义竖线。

在这种特殊情况下,Apache 配置文件中的一些行的开头不包含 #'s,因此 *# 也用于删除这些行。

7. 替换文件中不区分大小写的单词

要将以大写或小写开头的单词替换为另一个单词,我们还可以使用 sed。为了说明这一点,我们将 howtoing.txt 中的单词 zipZip 替换为 rar

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

8. 在日志文件中查找特定事件

sed 的另一个用途是打印文件中与给定正则表达式匹配的行。例如,我们可能有兴趣查看 7 月 2 日发生的授权身份验证活动,根据 /var /log/secure 登录 CentOS 服务器。

在本例中,要搜索的模式是每行开头的 Jul 2

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

9. 在文件中插入空格或空行

使用sed,我们还可以为文件中的每个非空行插入空格(空行)。要在纯文本文件 LICENSE 中每隔一行插入一个空行,请执行以下操作:

sed G tecmint.txt

要插入两个空行,请执行以下操作:

sed 'G;G' tecmint.txt

如果要添加更多空行,请添加一个用分号分隔的大写 G。下图展示了本技巧中概述的示例:

如果您想检查大型配置文件,此技巧可能会派上用场。每隔一行插入一个空格并将输出传输到 less 将带来更友好的阅读体验。

10. 删除文件中的^M

dos2unix 程序将纯文本文件从 Windows/Mac 格式转换为 Unix/Linux,删除这些平台中使用的某些文本编辑器插入的隐藏换行符。如果您的 Linux 系统中未安装它,您可以使用 sed 模仿其功能,而不是安装它。

在左图中,我们可以看到几个 DOS 换行符 (^M),后来被删除:

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

请注意,-i 选项表示就地编辑。然后更改不会返回到屏幕,而是保存到文件中。

注意:在 Vim 编辑器中使用 Ctrl+VCtrl+M 编辑文件时,您可以插入 DOS 换行符。

11.使用Sed命令创建备份文件

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

为此,请在 -i 选项后面指定一个后缀(在单引号内),用于重命名原始文件。

在下面的示例中,我们将用 myfile.txt 中的实例替换 thisThis (忽略大小写)的所有实例,然后保存原始文件为 myfile.txt.orig

最后,我们将使用 diff 实用程序来识别两个文件之间的差异:

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

12. 切换文件中的单词对

假设您有一个包含全名的文件,格式为名字姓氏。为了充分处理文件,您可能需要切换姓氏名字

我们可以使用 sed 相当轻松地做到这一点:

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

在上图中,我们可以看到括号是特殊字符,需要转义,数字12也是如此。

这些数字代表突出显示的正则表达式(需要出现在括号内):

  • 1 表示每行的开头到逗号。
  • 2 是逗号右侧到行尾所有内容的占位符。

所需的输出以以下格式表示:SecondColumn姓氏)+ 逗号 + 空格 + FirstColumn 名字)。请随意将其更改为您想要的任何内容。

13. 仅当找到单独的匹配项时才替换单词

有时替换给定单词的所有实例或随机的几个实例并不正是我们所需要的。如果找到单独的匹配项,也许我们需要执行替换。

例如,仅当在同一行中找到单词 services 时,我们可能才需要将 start 替换为 stop。在这种情况下,将会发生以下情况:

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 命令中组合两个或多个替换。让我们分别用 Thisverse 替换 myfile.txt 中的单词 that 和 line 。

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

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

该技巧如下图所示:

15. 结合 Sed 和其他命令

当然,sed 可以与其他 Linux 命令结合使用,以创建更强大的命令。例如,让我们使用 TIP #4 中给出的示例,并从 ip route 命令的输出中提取我们的 IP 地址。

我们将首先仅打印单词 src 所在的行。然后我们将多个空格转换为单个空格。最后,我们将剪切第 9 个字段(将单个空格视为字段分隔符),这是 IP 地址所在的位置:

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

下图说明了上述命令的每个步骤:

概括

在本指南中,我们分享了15 个 sed 提示和技巧来帮助您完成日常系统管理任务。您是否还经常使用其他任何技巧并愿意与我们和社区其他成员分享?

如果是这样,请随时使用下面的评论表告诉我们。也欢迎提出问题和意见——我们期待您的来信!