1 tolower($1) ~ /mary/ { print "CI Record: " $0; }
2 $0 !~ /Mary/ { print "Not Mary: " $0; }
3 $1 == "Mary" { print "Mary Record: " $0; }
为什么1
和3
使用$1
来比较2
和$0
?
答案 0 :(得分:22)
在awk中,$0
是整个参数行,而$1
只是由空格分隔的参数列表中的第一个参数。因此,如果我通过awk放“玛丽有一只小羊羔”,$1
是“玛丽”,但$0
是“玛丽有一只小羊羔”。第二行是试图在给予awk的整行中找到子串“Mary”。
答案 1 :(得分:9)
实际上,示例# 2
正在使用正则表达式,因为这种语法
/regex/
在您的示例中,如果在整行(Mary
)中找不到文字文本$0
,则表示执行awk代码。
$1 == "Mary"
正在对文字Mary
和字段#1($1
)进行直接比较。
最后tolower($1) ~ /mary/
再次在字段#1上使用ignre-case正则表达式匹配,这意味着如果$1
具有文本mary
(ignore-case),则执行其余的awk代码。
答案 2 :(得分:2)
从链接中的描述(强调我的):
表达式通常是字段之一或结果 其中一个字段的操作。例如,以下AWK 过滤规则显示,分别,如何比较第一个字段 “玛丽”以不区分大小写的方式,如何匹配所有记录 不包含“Mary”,以及如何对进行精确比较 字段反对“玛丽”:
所以打破它:
第一个:
how to compare the first field to “mary” in a case-insensitive fashion
因为它正在比较第一个字段,所以它使用$1
如何匹配所有不包含“Mary”的记录,
由于它正在比较所有记录,因此它使用$0
第三个
以及如何对第一个字段与“Mary”进行精确比较:
再次比较第一个字段,因此使用$1
。