良许Linux教程网 干货合集 sed和AWK对Linux的重要性

sed和AWK对Linux的重要性

sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作。

u=717609104,2272765680&fm=26&gp=0

什么是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/
img

如果您需要进行一些更复杂的编辑,您还可以将 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。这告诉它将脚本作为文件打开。

最终结果是这样的:

img

还值得注意的是 sed 支持正则表达式 (REGEX)。这些允许您使用特殊而复杂的语法在文本中定义模式。

这是一个如何工作的示例。我们将采用上述歌词,但使用正则表达式打印出每行不以“Take”开头的行。

linuxmi@linuxmi:~/www.linuxmi.com$ cat linuxmi.com.txt | sed /^Take/d
img

当然,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
img

结合两者

awk 和 sed 结合起来都非常强大。您可以通过使用 Unix 管道来做到这一点。

让我们试试这个:我们将使用 awk 列出“Take On Me”中超过 20 个字符的所有行。然后,我们将删除所有以“Take”开头的行。总之,这一切看起来像这样:

linuxmi@linuxmi:~/www.linuxmi.com$ awk 'length($0)>20' linuxmi.com.txt | sed /^Take/d

输出如下:

img

sed 和 awk 的力量

在这篇文章中我们就解释这么多,但希望您现在对 sed 和 awk 的强大功能有所了解。简而言之,它们是一个文本处理引擎。

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

img
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部