sed 和 awk 是每个 Linux 高级用户最喜欢的工具。但它们是什么?以及如何使用它们来处理文本文件?两个最被低估的 Linux 实用程序是 sed 和 awk。尽管它们看起来有点神秘,但如果您必须对大段代码或文本进行重复更改,或者如果您必须分析某些文本,sed 和 awk 是极为有用的。那么,它们是什么?它们是如何使用的?以及,当它们组合在一起时,它们如何使处理文本变得更容易?
什么是sed?
sed 由传奇的计算先驱 Lee E. McMahon 于 1971 年在贝尔实验室开发。该名称代表“流编辑器”。sed 允许您通过一种紧凑而简单但图灵完备的编程语言以编程方式编辑正文或文本流。sed 的工作方式很简单:它将文本逐行读取到缓冲区中。对于每一行,它将在适用的情况下执行预定义的指令。例如,如果有人要编写一个 sed 脚本,将单词“beer”替换为“soda”,然后传入一个包含“99 Bottles of Beer on the Wall”完整歌词的文本文件,它将通过逐行打印该文件,并打印出“99 Bottles of Soda on the Wall”,依此类推。最基本的 sed 脚本是“Hello World”。在这里,我们使用仅输出字符串的 echo 命令来打印“Hello World”。但是我们将它传递给 sed,并告诉它用“LinuxMi.com”替换“World”。一目了然。
linuxmi@linuxmi:~/www.linuxmi.com$ echo "Hello World" | sed s/World/LinuxMi.com/
如果您需要进行一些更复杂的编辑,您还可以将 sed 指令组合到文件中。让我们将 A-ha 的“ Take On Me ”的歌词替换为Greg的“I”、“Me”和“My”的每个实例。首先,将歌曲的歌词放入名为linuxmi.com.txt的文本文件中。然后打开您喜欢的文本编辑器,并添加以下行。确保您创建的文件以.sed结尾。
s/I/Greg/
s/Me/Greg/
s/me/Greg/
s/My/Greg/
s/my/Greg/
您可能会注意到上面示例中的重复(例如 s/me/Greg/ 和 s/Me/Greg/)。这是因为 sed 的某些版本,例如 macOS 附带的版本,不支持不区分大小写的匹配。因此,我们必须为每个单词编写两条指令,以便 sed 识别大写和非大写版本。这不会完美地工作,就好像您已经手动替换了“I”、“Me”和“My”的每个实例。请记住,我们只是将其用作练习来演示如何将 sed 指令组合到一个脚本中,然后使用单个命令执行它们。然后,我们需要调用该文件。为此,请运行此命令。
linuxmi@linuxmi:~/www.linuxmi.com$ cat linuxmi.com.txt | sed -f linuxmi.sed
让我们看看这是怎么做的。你可能已经注意到我们这里没有使用 echo。我们使用 cat。这是因为 cat 会打印文件的全部内容,而 echo 只会打印文件名。您可能还注意到,我们使用“-f”标志运行 sed。这告诉它将脚本作为文件打开。
最终结果是这样的:还值得注意的是 sed 支持正则表达式 (REGEX)。这些允许您使用特殊而复杂的语法在文本中定义模式。这是一个如何工作的示例。我们将采用上述歌词,但使用正则表达式打印出每行不以“Take”开头的行。
linuxmi@linuxmi:~/www.linuxmi.com$ cat linuxmi.com.txt | sed /^Take/d
当然,sed 非常有用。而且与 awk 结合使用时会更加强大。
什么是 AWK?
AWK 与 sed 一样,是一种处理大量文本的编程语言。但是,虽然人们使用 sed 来处理和修改文本,但人们大多使用 AWK 作为分析和报告的工具。与 sed 一样,AWK 最初是在 1970 年代在贝尔实验室开发的。它的名字并非来自程序所做的事情,而是来自每个作者的姓氏:Alfred Aho、Peter Weinberger 和 Brian Kernighan。总而言之,AWK 指的是编程语言本身。在小写中,awk 指的是命令行工具。AWK 通过一次读取一行文本文件或输入流来工作。扫描每一行以查看它是否与预定义的模式匹配。如果找到匹配项,则执行操作。但是虽然 sed 和 AWK 可能有相似的目的,但它们是两种完全不同的语言,具有两种完全不同的设计理念。AWK 更类似于一些通用语言,如 C、Python 和 Bash。它具有诸如函数之类的东西以及更类似于 C 的方法来处理诸如迭代和变量之类的东西。简而言之,AWK 感觉更像是一种编程语言。所以,让我们尝试一下。使用“Take On Me”的歌词,我们将打印所有超过 20 个字符的行。
linuxmi@linuxmi:~/www.linuxmi.com$ awk ' length($0) > 20 ' linuxmi.com.txt
结合两者
awk 和 sed 结合起来都非常强大。您可以通过使用 Unix 管道来做到这一点。让我们试试这个:我们将使用 awk 列出“Take On Me”中超过 20 个字符的所有行。然后,我们将删除所有以“Take”开头的行。总之,这一切看起来像这样:linuxmi@linuxmi:~/www.linuxmi.com$ awk 'length($0)>20' linuxmi.com.txt | sed /^Take/d
输出如下:sed 和 awk 的力量
在这篇文章中我们就解释这么多,但希望您现在对 sed 和 awk 的强大功能有所了解。简而言之,它们是一个文本处理引擎。那么,你为什么要关心呢?除了您永远不知道何时需要对文本文档进行可预测的重复更改这一事实之外,sed 和 awk 非常适合解析日志文件。当您尝试调试 LAMP 服务器中的问题或查看访问日志以查看您的服务器是否被黑客入侵时,这特别方便。
审核编辑 :李倩
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
Linux
+关注
关注
87文章
10990浏览量
206734 -
编程语言
+关注
关注
9文章
1878浏览量
33085 -
SED
+关注
关注
0文章
23浏览量
26995
原文标题:为什么说每个 Linux 极客都需要了解 Sed 和 Awk
文章出处:【微信号:Linux迷,微信公众号:Linux迷】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
选择贴片电容时需要了解哪些问题?
购买贴片电容时,需要了解以下几个方面: 1、电容类型与规格:贴片电容有多种类型,如陶瓷电容器、铝电解电容器、钽电解电容器、多层陶瓷电容器(MLCC)以及聚合物电容器等。每种类型都有其特定的应用场
需要了解的FPGA基础知识
的尖端技术时,设计者需要考虑的是,基础标准和协议还在不断地发展。这就是说,设计者需要能够迅速、有效地应对任何超出控制范围的规范变更。类似地,它们需要能够灵活地对系统部署到现场之后发生的
发表于 11-20 18:56
如何像 awk一样分割字符串
若你使用过 Shell 中的 awk 工具,会发现用它来分割字符串是非常方便的。特别是多个连续空格会被当做一个处理。 [root @localhost ~] # cat demo.txt hello
PLC的8种常见错误类型,PLC修理人员需要了解
我们整理了当PLC呈现反常报警时,PLC修理人员需要了解的8种常见错误类型。一、CPU反常CPU反常报警时,应查看CPU单元衔接于内部总线上的一切器材。具体方法是顺次替换可能存在问题的单元,找出
关于Linux高级指令的介绍
\' filename将在第三行之前插入一行文本,而sed \'$a\\appended line\' filename将在文件末尾追加一行文本。
4. awk 命令:处理结构化文本数据的好帮手
awk
发表于 09-01 15:44
介绍一些实用的Linux命令
作为一名软件开发人员,掌握 Linux 命令是必不可少的技能。即使你使用 Windows 或 macOS,你总会遇到需要使用 Linux 命令的场合。例如,大多数 Docker 镜像都基于 L
发表于 08-01 16:12
•189次阅读
Linux中sed命令用法
这篇文章为初学者提供了关于 Linux 中 sed 命令的全面指南,涵盖了其历史、用途以及一些实用的技巧和窍门。通过掌握 sed,您可以高效处理文本处理任务,这对于任何使用 Linux
发表于 07-21 10:38
•230次阅读
您需要了解的有关射频匹配网络的5件事
在RF电路中,阻抗可以在很宽的频率范围内变化。RF匹配网络的主要目标是匹配源和负载的阻抗,以最大限度地提高功率传输,并在所需的工作频率范围内最小化反射。这需要了解源和负载的阻抗,并选择在该频率下产生匹配的组件。
安装OLED拼接屏之前,需要了解OLED拼接屏的结构
。 首先,需要了解OLED拼接屏的结构 OLED拼接屏由多个OLED屏幕拼接而成,每个OLED屏幕都有自己的支架和固定装置。在拼接时,需要将每个OLED屏幕固定在支架上,并通过固定
公交导乘屏选择需要了解哪些参数?
公交导乘屏选择需要了解哪些参数? 公交导乘屏的应用范围是很广泛,我们生活的方方面面都有接触到公交导乘屏,比如:车载、货架、机场、餐厅、多媒体教学、地铁站台、公交站台等。以车载类公交导乘屏为列,车载
评论