每个Linux极客都需要了解Sed和Awk。这就是为什么...

Sed和Awk是两个犯罪率最低的Linux实用程序。尽管可以承认,它们似乎有些不可思议,但是如果您不得不对大型代码或文本进行重复更改,或者必须分析某些文本,那么Sed和Awk就是无价之宝。

因此,这些是什么?如何使用?以及如何将它们组合在一起使它们更易于处理文本?

什么是Sed?

Sed是由传奇计算先驱Lee E于1971年在贝尔实验室开发的。 McMahon。

名称代表流编辑器,这就是它的功能。它允许您通过紧凑,简单但图灵完备的编程语言,以编程方式来编辑正文或文本流。

工作方式很简单:读取文本,逐行插入缓冲区。对于每一行,它将在适用的情况下执行预定义的指令。

例如,如果有人要编写一个Sed脚本,用“ soda"代替“ beer"一词,然后传入包含“墙上的99瓶啤酒"的全部歌词的文本文件,它将逐行浏览该文件,并打印出“墙上的99瓶汽水",依此类推。

最基本的Sed脚本是Hello World脚本。在这里,我们使用Unix Echo实用程序(仅输出字符串)来打印“ Hello World"。但是,我们将其发送给Sed,并告诉它用“ Dave"代替“ World"。自我解释的东西。

echo "Hello World" | sed s/world/Dave

如果需要进行一些更复杂的编辑,还可以将Sed指令合并到文件中。受到这个热闹的Reddit主题的启发,我将歌词添加到A-Ha的 Take On Me 中,并用Greg替换“ I",“ Me"和“ My"的每个实例

首先,我将歌词添加到名为 tom.txt 的文本文件中。然后打开我喜欢的文本编辑器(我最喜欢的是Vim都是不错的选择),然后添加以下几行。确保您创建的文件以 .sed结尾。

您可能会注意到,在上面的示例中,我重复了自己的操作(例如s / me / Greg /和s /我/格雷格/)。这是因为某些版本的Sed(例如Mac OS X随附的版本)支持不区分大小写的匹配。结果,我们必须为每个单词写两个Sed指令,以便它可以识别大写和不大写的版本。

这不能完美地工作,就好像您已经替换了每个“ I ",“我"和“我的"。记住,我们只是以此为练习,演示如何将Sed指令分组为一个脚本,然后使用一个命令执行它们。

然后,我们需要调用该文件。为此,我们运行以下命令。

cat tom.txt | sed -f greg.sed

让我们放慢速度,看看它的作用。眼神敏锐的读者会注意到,我们在这里使用Echo。我们正在使用Cat。这是因为,尽管Cat将打印出文件的全部内容,但echo仅将打印出文件名。您还会注意到,我们在运行Sed时带有“ -f"标志。

最终结果是这样。

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

这里是一个示例,说明了可能的工作方式。我们将采用上述歌曲的歌词,但是使用正则表达式打印出不是以“ Take"开头的每一行。

cat tom.txt | sed /^Take/d

Sed当然是非常有用。

什么是Awk?

Awk与Sed一样,是一种用于处理大量文本的编程语言。但是,虽然使用Sed处理和修改文本,但Awk大多用作分析报告的工具。

像Sed一样,Awk首先在1970年代由Bell Labs开发。它的名字不是来自程序的用途,而是每个作者的姓氏-Alfred Aho,Peter Weinberger和Brian Kernaghan。

Awk通过阅读来工作文本文件或输入流,每次一行。扫描每行以查看其是否匹配预定义的模式。如果找到匹配项,则会执行操作。

尽管Sed和Awk可能具有相似的目的,但它们是两种完全不同的语言,具有两种完全不同的设计理念。 Awk更类似于某些通用语言)。简而言之,它感觉更像是一种编程语言。

所以,让我们尝试一下。使用歌词“ Take On Me",我们将打印所有长度超过20个字符的行。

下一个示例我毫不客气地抄袭了官方。 AWK文档。但这是这种强大而精巧的语言潜力的一个很好的例子。这也是关于迭代和变量如何工作的很好的展示。首先,创建一个名为“ WordCount.awk"的文件,并添加以下几行。

{ for (i = 1; i <= NF; i++) freq[$i]++}
END { for (word in freq) printf "%s\t%d\n", word, freq[word]}

保存它,然后使用以下命令运行它。

awk -f WordCount.awk tom.txt

结合两者< /

Awk和Sed结合在一起时都非常强大。您可以使用Unix管道来做到这一点。这些是命令之间的“ |"位。

让我们尝试一下:我们将使用Awk列出Take On Me中具有20个以上字符的所有行。然后,我们将剥离所有以“接管" 开头的行。在一起,一切看起来像这样:

awk 'length($0)>20' tom.txt | sed /^Take/d

并生成以下代码:

现在,我们将其翻转。我们将首先删除以Take开头的所有行,然后将它们通过管道传输到Awk,在此我们将计算每个单词出现的次数。看起来有点像这样:

cat tom.txt | sed /^Take/d | awk -f WordCount.awk

Sed和Awk的力量

您只能在一篇文章中进行解释。但我希望我已经说明了Sed和Awk的强大功能。 简而言之,它们是文本处理的强大力量。

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

您发现了以下用途吗? Sed和Awk?您是否还有其他Linux实用程序未被重视?在下面的评论中让我知道,我们将聊天。

标签: 终端 文本编辑器