7

为什么说每个 Linux 极客都需要了解 Sed 和 Awk

 2 years ago
source link: https://os.51cto.com/article/703624.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

a9feb537502afd15c34390f22bf9353613074d.jpg

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/

33fab3261c5d7857508293003f4438fa370922.jpg

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

最终结果是这样的:

845ee2653b74f27695e821399e83a0e96715c3.jpg

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

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

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

b948bf695fe38bc3dba906881e3b66d72919e3.jpg

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

e365ada15b6bfa2cbfd1573ae3eead4232fa95.jpg

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

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

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

输出如下:

53ea20b11548aaa72e185934361db4bd3fbb25.jpg

sed 和 awk 的力量

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

那么,你为什么要关心呢?除了您永远不知道何时需要对文本文档进行可预测的重复更改这一事实之外,sed 和 awk 非常适合解析日志文件。当您尝试调试 LAMP 服务器中的问题或查看访问日志以查看您的服务器是否被黑客入侵时,这特别方便。


Recommend

  • 12

    Learn Sed and Awk to Enhance Your UNIX / Linux Life If you are spending lot of time on UNIX / Linux, the following might sound familiar to you. You are manually making the same edits on multiple...

  • 20

    学习使用 Sed 文本编辑器 | Linux 中国Sed 缺少通常的文本框,而是按照用户的命令直接写入到文件上。来源:https://linux.c...

  • 4

    每个程序员都需要知道的 15 个 Linux 实用技巧 2 熟悉 Linux 系统的同学都知道,它高效主要体现在命令行。通过命令行,可以将很多简单的命令,通过自由的组合,得到非常强大的功能。 命令行也就意...

  • 9
    • zhang.ge 3 years ago
    • Cache

    Linux:sed命令详解

    Linux:sed命令详解 | 张戈博客Jager · 3月6日 · 2014年linux · sed 2607次已读 sed是非交互式的编辑器。它不会修...

  • 3

    一些命令行小技巧:wc、sort、sed 和 tr | Linux 中国让我们来看看一些命令行实用工具,当你热衷于终端而不是 GUI 时,它们可能更顺手。来源:

  • 5

    用 Linux sed 命令替换智能引号 | Linux 中国用你喜欢的 sed 版本去除“智能”引号。来源:https://linux.cn/article-13806-1...

  • 3
    • segmentfault.com 2 years ago
    • Cache

    005 Linux 命令三剑客之-sed

    grep:数据查找定位awk:数据切片,数据格式化,功能最复杂sed:数据修改01 Linux 命令三剑客?三剑客各有所长,和锅锅一一搞起就是了!sed:擅...

  • 5

    - 行编辑工具: 一行一行处理文件内容 - 全屏编辑工具:一次性将文件所有内容加载到内存中 sed编辑器: Stream Editor 工作原理: 逐行处理文件内容,一次读取一行内容到模...

  • 0
    • schaepher.github.io 1 year ago
    • Cache

    sed 命令 —— Linux

    sed 命令 —— LinuxSchaepher 2022-09-10  约 495 字   预计阅读 1 分钟 如果想将 sed 操作的结果写入源文件,加上 -i

  • 6
    • www.51cto.com 1 year ago
    • Cache

    掌握 Linux sed 命令综合指南

    掌握 Linux sed 命令综合指南 作者:Linux迷 2023-07-03 22:35:50 本文旨在为初学者提供关于如何在 Linux 中使用 sed(流编辑器)命令的全面指南。它涵盖了该命令的历史、用法、参数、常见用例以及技巧和窍门。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK