之前从未在Linux上使用awk
我试图理解它是如何匹配正则表达式的。例如,在过去根据我的经验,正则表达式/2/
将在以下所有行中匹配2。
现在,如果我运行具有内容
的命令awk '{if(NR~2)print}' sample.txt
匹配的行是This will not match 2
,表示它与第2行匹配,因为如果我将命令替换为awk '{if(NR~3)print}' sample.txt
,则匹配2 may be matched
。现在,如果我也运行命令awk '{if(NR~/^2$/)print}' sample.txt
,则匹配相同的确切行,即第2行。
然而,我在http://www.youtube.com/watch?feature=player_detailpage&v=Htnno4CHVus#t=502s指的来源似乎表示不同。
我缺少什么,awk '{if(NR~2)print}' sample.txt
命令与awk '{if(NR~/^2$/)print}' sample.txt
的命令有什么不同?
答案 0 :(得分:4)
条件NR~2
正在检查记录号NR是否匹配2.对于2或3行输入文件,表达式相当于:
if (NR == 2)
与NR~3
类似,当然。尝试:
awk '/2/'
这将打印行($0
)的文本包含2的所有行。默认情况下,正则表达式与整行匹配;例如,您可以使用$3 ~ /3/
将其限制为特定字段。
awk
程序由模式和动作组成,其中模式或动作可以省略。
awk '{ if ($0 ~ /2/) print }
/2/
/2/ { if ($0 ~ /a.*z/) print "Matches a.*z"; }'
第一行没有模式; { ... }
中的操作是针对每个输入行执行的(但由于条件的原因,只有一些输入行会生成输出。所有包含2的行都将被打印。(如果{{1}没有参数) },它打印print
后跟换行符。)
第二行有一个模式,但没有动作;包含2的所有行将再次打印。 (缺少的操作相当于$0
。)
第三行既有模式又有动作;所有包含2且包含'a'后跟'z'的行都将被注明。
这两个命令有何不同?
{ print }
第一个命令将打印行号1,2,12,20..29,32,42,... 102,112,120..129,... 200..299,......;行号包含2的所有行。
第二个命令将仅打印第2行,因为 `awk '{if(NR~2)print}' sample.txt`
`awk '{if(NR~/^2$/)print}' sample.txt`
约束该值以包含字符串的开头,数字2和字符串的结尾。
我认为这意味着来源错了?
现在我看过YouTube资源,我想你一定是误解了它想要教的内容。在谈到/^2$/
时,应该说它会打印任何包含2的行号;视频引用第2,12,20,21,22等号行。不应该说任何包含2的行;我认为视频会说,但视频错误(但文字准确)。与NR的比较实际上并没有错,但它是常规的;我不确定我是否会在描述{if (NR~2) print}
的介绍性视频中包含针对NR的正则表达式。因此,视频似乎在音频中出现故障,但我认为屏幕上的文字是准确的。我可能还是错过了什么。
对文件的
awk
命令说awk '{ if ($0 ~ /2/) print }
,我提到的内容只会导致输出2匹配。这是对的吗?
该命令,给定输入:
sample.txt
将打印所有三行;它们都包含数字2。
我还认为该操作为
2 will be matched This will not match 2 2 may be matched
,模式为
没有;模式是空的(因为在开放式大括号之前没有任何内容) - 因此所有行都匹配它 - 并且动作是大括号$0 ~ /2/
中的部分。现在,该操作包含一个条件,但这是一个单独的问题。
现在命令
{ if ($0 ~ /2/) print }
将打印所有三行。这是对的吗?
是
答案 1 :(得分:1)
NR
表示正在处理的记录号...
您正在与第2行匹配。