23

例如,在awk教程中有三个示例:

  1. tolower($1) ~ /mary/ { print "CI Record: " $0; }
  2. $0 !~ /Mary/ { print "Not Mary: " $0; }
  3. $1 == "Mary" { print "Mary Record: " $0; }
4

3 回答 3

42

在 awk 中,$0是整行参数,而$1只是由空格分隔的参数列表中的第一个参数。因此,如果我通过 awk 输入“Mary had a little lamb”,$1就是“Mary”,而是$0“Mary had a little lamb”。第二行试图在给 awk 的整行中找到子字符串“Mary”。

于 2013-03-26T21:08:26.043 回答
13

实际上# 2,由于这种语法,示例正在使用正则表达式

/regex/

Mary这意味着在您的示例中,如果在整行 () 中的任何位置都找不到文字文本,$0则执行 awk 代码。

而在文字文本和字段#1()$1 == "Mary"之间进行直接比较。Mary$1

最后tolower($1) ~ /mary/再次在字段 #1 上使用 ignre-case 正则表达式匹配,这意味着如果$1有文本mary(忽略大小写),则执行其余的 awk 代码。

于 2013-03-26T21:06:05.953 回答
2

从链接中的描述(强调我的):

表达式通常是字段之一或对其中一个字段进行操作的结果。例如,下面的 AWK 过滤规则分别展示了如何以不区分大小写的方式将第一个字段与“mary”进行比较,如何匹配所有不包含“Mary”的记录,以及如何对反对“玛丽”的第一场:

所以分解它:

第一:

 how to compare the first field to “mary” in a case-insensitive fashion

因为它比较第一个字段,所以它使用$1

如何匹配所有不包含“Mary”的记录,

由于它正在比较所有记录,因此它使用$0

第三个

以及如何将第一个字段与“Mary”进行精确比较:

再次比较第一个字段,所以它使用$1.

于 2013-03-26T21:09:08.223 回答