awk和正则表达式混淆

时间:2012-06-16 22:07:51

标签: awk

之前从未在Linux上使用awk我试图理解它是如何匹配正则表达式的。例如,在过去根据我的经验,正则表达式/2/将在以下所有行中匹配2。

  1. 这将匹配2
  2. 这不符合2
  3. 现在,如果我运行具有内容

    的命令awk '{if(NR~2)print}' sample.txt
    1. 2将匹配
    2. 这不符合2
    3. 2可能匹配
    4. 匹配的行是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的命令有什么不同?

2 个答案:

答案 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 ,模式为print

没有;模式是空的(因为在开放式大括号之前没有任何内容) - 因此所有行都匹配它 - 并且动作是大括号$0 ~ /2/中的部分。现在,该操作包含一个条件,但这是一个单独的问题。

  

现在命令{ if ($0 ~ /2/) print }将打印所有三行。这是对的吗?

答案 1 :(得分:1)

NR表示正在处理的记录号... 您正在与第2行匹配。