这里我有一部分用于解析文件的awk代码,但输出不是我想要的100%。
match($0,/root=[^,]*/){
n=split(substr($0,RSTART+5,RLENGTH-5),N,/:/)
我的问题是,我不能100%地告诉这段代码到底在做什么...... 有人可以告诉我这两行究竟是做什么的吗?
编辑: 我只是想知道代码是做什么的,所以我可以自己解决,所以请不要问:你解析的文件是怎样的? ..
答案 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
设置的RLENGTH
和match
来获取匹配的行的子字符串(减去root=
,因为+5
/ -5
)然后将其拆分为N
上的数组:
,并保存分割为n
的字段数。
如果您愿意,可以将其更改为match($0, /root=([^,]*)/, N)
作为模式,然后在操作中使用N[1,"start"]
而不是substr
。