这段代码有什么作用? (AWK)

时间:2014-10-29 13:38:59

标签: linux awk

这里我有一部分用于解析文件的awk代码,但输出不是我想要的100%。

match($0,/root=[^,]*/){
        n=split(substr($0,RSTART+5,RLENGTH-5),N,/:/)

我的问题是,我不能100%地告诉这段代码到底在做什么...... 有人可以告诉我这两行究竟是做什么的吗?

编辑: 我只是想知道代码是做什么的,所以我可以自己解决,所以请不要问:你解析的文件是怎样的? ..

1 个答案:

答案 0 :(得分:2)

  

匹配(s,r [,a])

     

返回正则表达式r出现的位置,或0   如果r不存在,则设置RSTART和RLENGTH的值。注意   参数顺序与〜运算符相同:str~re。   如果提供了数组a,则清除a,然后清除元素1到n   填充s匹配相应的部分   r中带括号的子表达式。 a的第0个元素包含   s的一部分与整个正则表达式r匹配。标   a [n,“start”]和[n,“length”]提供起始索引   每个匹配子字符串的字符串和长度。

     

substr(s,i [,n])

     

从i开始返回s的最多n个字符的子字符串。如果是   省略,其余的s被使用。

     

split(s,a [,r])

     

将字符串s拆分为正则表达式r上的数组a,并且   返回字段数。如果省略r,则使用FS。该   数组a首先被清除。拆分行为与字段相同   分裂,如上所述。

因此,当匹配在行(/root=[^,]*/)中找到与$0匹配的内容时,它将返回该位置(非零整数对于awk是真实的)并且操作将执行。

然后,操作会使用RSTART设置的RLENGTHmatch来获取匹配的行的子字符串(减去root=,因为+5 / -5)然后将其拆分为N上的数组:,并保存分割为n的字段数。

如果您愿意,可以将其更改为match($0, /root=([^,]*)/, N)作为模式,然后在操作中使用N[1,"start"]而不是substr