AWK在20分钟内(2015)

2020-05-02 18:05:56

AWK是一种小型编程语言和命令行工具。它特别适合于服务器上的日志解析,主要是因为Awk将对文件进行操作,这些文件通常是以人类可读的文本行为结构的。

我说它在服务器上很有用,因为日志文件、转储文件或服务器最终转储到磁盘的任何文本格式的文件都会变得很大,而且每个服务器上都会有很多这样的文件。如果你曾经遇到过这样的情况,你不得不在没有像Splunk或其等价物这样的工具的情况下分析来自50个不同服务器的千兆字节的文件,如果在本地拥有并下载所有这些文件,然后对它们进行一些取证,那会让人感觉相当糟糕。

当一些Erlang节点趋于死亡并留下700MB到4 GB的崩溃转储时,或者在需要快速查看日志以寻找通用模式的较小的单个服务器(比如VPS)上,我个人就会发生这种情况。

在任何情况下,Awk不仅仅是查找数据(否则,grepor ack就足够了)-它还允许您处理数据并对其进行转换。

#Comment Pattern1{Actions;}#Comment Pattern2{Actions;}#Comment Pattern3{Actions;}#Comment Pattern4{Actions;}。

要扫描的文档的每一行都必须通过每种模式,一次扫描一个。因此,如果我传入一个包含以下内容的文件:

那么这是第1行的内容将与Pattern1匹配。如果匹配,将执行操作。然后,该行1将与Pattern2匹配。如果不匹配,则跳到Pattern3,依此类推。

一旦清除了所有模式,这是第2行将经历相同的过程,对于其他行依此类推,直到完全读取输入。

AWK只有两种主要的数据类型:字符串和数字。即使那样,Awk也喜欢把它们相互转换。字符串可以解释为数字,以便将它们的值转换为数字。如果字符串看起来不像数字,则为0。

两者都可以使用=运算符分配给代码的操作部分中的变量。变量可以随时随地声明并使用,即使它们没有初始化:它们的默认值是空字符串。

最后,AWK有数组。它们是可以动态启动的一维关联阵列。它们的语法只是var[key]=value。AWK可以模拟多维数组,但无论如何它都是一个大麻烦。

可以使用的模式分为三大类:正则表达式、布尔表达式和特殊模式。

Awk正则表达式是您常用的正则表达式。它们不是awk下的PCRE(但gawk将支持更奇特的东西-这取决于实现!)。参见with awk--version),不过对于大多数用法,他们会做很多事情:

/admin/{.}#包含';admin';/^admin/{.}#行的任何行,以';admin';/admin$/{.}#行开头,以';admin';/^[0-9.]+/{.}#行开头/(POST|PUT|DELETE)/#包含特定HTTP谓词的行。

诸若此类。请注意,模式不能捕获特定组以使其在代码的操作部分可用,它们专门用于匹配内容。

布尔表达式与您在PHP或Javascript中发现的类似。具体地说,可以使用运算符&;&;(";和";)、||(";或";)和!(";不是";)。这也是您在几乎所有类C语言中都会发现的。它们将操作任何常规数据类型。

更像PHP和Javascript的是比较运算符==,它将执行模糊匹配,以便字符串与数字23进行比较,从而使";23";=23为真。运算符!=也可用,但不要忘记其他常见运算符:>;、<;、>;=和<;=。您还可以混合使用这些模式:布尔表达式可以与正则表达式一起使用。模式/admin/||debug==true有效,并且在.。

请注意,如果您有一个要与正则表达式匹配的特定字符串或变量,运算符~和!~就是您想要的,将用作字符串~/regex/.。

第一个是BEGIN,它只在将任何行输入到文件之前进行匹配。这基本上就是你可以启动变量和所有其他类型状态的地方。

还有end,正如您可能已经猜到的,它将在处理完整个输入之后匹配。这使您可以在退出之前清理或执行一些最终输出。..。

最后,最后一种模式有点难以分类。它介于变量和特定值之间,它们被称为字段,这是值得的。