当前位置: 首页 > 科技观察

为什么每个Linux极客都需要知道Sed和Awk

时间:2023-03-12 09:43:17 科技观察

sed和awk是每个Linux高级用户最喜欢的工具。但它们是什么?以及如何使用它们来处理文本文件?两个最被低估的Linux实用程序是sed和awk。尽管它们看起来很神秘,但如果您必须对大块代码或文本进行重复更改,或者如果您必须分析某些文本,sed和awk将非常有用。那么,它们是什么?它们是如何使用的?而且,当结合使用时,它们如何使处理文本变得更容易?什么是sed?sed于1971年由传奇计算先驱LeeE.McMahon在贝尔实验室开发。该名称代表“流程编辑器”。sed允许您通过紧凑、简单但图灵完备的编程语言以编程方式编辑文字或文本流。sed的工作方式很简单:它逐行将文本读入缓冲区。对于每一行,它将在适用的情况下执行预定义的指令。例如,如果有人要编写一个sed脚本将单词“beer”替换为“soda”,然后传入一个包含“99BottlesofBeerontheWall”的完整歌词的文本文件,它将打印该文件逐行打印出“99BottlesofSodaontheWall”,等等。最基本的sed脚本是“HelloWorld”。在这里,我们使用仅输出字符串的echo命令打印“HelloWorld”。但是我们将它传递给sed并告诉它用“LinuxMi.com”替换“World”。一目了然。linuxmi@linuxmi:~/www.linuxmi.com$echo"你好世界"|seds/World/LinuxMi.com/如果你需要做一些更复杂的编辑,你也可以将sed指令组合到文件中。让我们用Greg的“I”、“Me”和“My”的每个实例替换A-ha的“TakeOnMe”的歌词。首先,将歌曲的歌词放入名为linuxmi.com.txt的文本文件中。然后打开文本编辑器并添加以下行。确保您创建的文件以.sed结尾。s/I/Greg/s/Me/Greg/s/me/Greg/s/My/Greg/s/my/Greg/您可能会注意到上面示例中的重复(例如s/me/Greg/和s/Me/格雷格/)。这是因为某些版本的sed(例如macOS附带的版本)不支持不区分大小写的匹配。因此,我们必须为每个单词编写两个指令,以便sed识别大写和非大写版本。这不会完美地工作,就好像您手动替换了“I”、“Me”和“My”的每个实例一样。请记住,我们只是将其用作练习来演示如何将sed指令组合到脚本中,然后使用单个命令执行它们。然后,我们需要调用该文件。为此,请运行此命令。linuxmi@linuxmi:~/www.linuxmi.com$猫linuxmi.com.txt|sed-flinuxmi.sed让我们看看这是如何完成的。您可能已经注意到我们在这里没有使用echo。我们用猫。这是因为cat会打印文件的全部内容,而echo只会打印文件名。您可能还会注意到我们使用“-f”标志运行sed。这告诉它将脚本作为文件打开。最终结果是这样的:同样值得注意的是sed支持正则表达式(REGEX)。这些允许您使用特殊和复杂的语法在文本中定义模式。这是它如何工作的一个例子。我们将采用上面的歌词,但使用正则表达式打印出不以“Take”开头的每一行。linuxmi@linuxmi:~/www.linuxmi.com$猫linuxmi.com.txt|sed/^Take/d当然,sed非常有用。当与awk结合使用时,它甚至更强大。什么是AWK?AWK与sed一样,是一种用于处理大量文本的编程语言。但是当人们使用sed来处理和修改文本时,人们大多使用AWK作为分析和报告的工具。与sed一样,AWK最初是在1970年代在贝尔实验室开发的。它的名字不是来自程序的功能,而是来自每位作者的姓氏:AlfredAho、PeterWeinberger和BrianKernighan。总而言之,AWK指的是编程语言本身。在小写字母中,awk指的是命令行工具。AWK通过一次读取文本文件或输入流来工作。扫描每一行以查看它是否与预定义的模式匹配。如果找到匹配项,则执行操作。但尽管sed和AWK可能有相似的目的,但它们是两种完全不同的语言,有着两种完全不同的设计哲学。AWK更类似于一些通用语言,例如C、Python和Bash。它有函数之类的东西,还有更像C的方法来处理迭代和变量之类的东西。简而言之,AWK更像是一种编程语言。那么,让我们试试吧。使用“TakeOnMe”的歌词,我们将打印所有超过20个字符的行。linuxmi@linuxmi:~/www.linuxmi.com$awk'length($0)>20'linuxmi.com.txtawk和sed的结合非常强大。您可以使用Unix管道来完成此操作。让我们试试这个:我们将使用awk列出“TakeOnMe”中超过20个字符的所有行。然后,我们将删除所有以“Take”开头的行。总之,它看起来像这样:linuxmi@linuxmi:~/www.linuxmi.com$awk'length($0)>20'linuxmi.com.txt|sed/^Take/d输出如下:sed和awk的强大功能这就是本文的全部内容,但希望您现在已经了解sed和awk的强大功能。简而言之,它们是一个文本处理引擎。那你为什么要关心呢?除了您永远不知道何时需要对文本文档进行可预测的重复更改这一事实之外,sed和awk非常适合解析日志文件。当您尝试调试LAMP服务器中的问题或查看访问日志以查看您的服务器是否被黑客入侵时,这尤其方便。