2014-10-29 94 views
0

這裏我有我的awk代碼的一部分來解析文件,但輸出不是我想要的100%。這段代碼做了什麼? (awk)

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

我的問題是,我不能100%,這是什麼一段代碼究竟做什麼...... 有人能告訴我這是什麼兩行究竟知道?

編輯: 我只是想知道代碼的作用,所以我可以自己修復它,所以請不要問這樣的問題:你解析的文件是怎麼樣的? ..

回答

2

匹配(S,R [,A])

返回S其中正則表達式ř發生的位置,或者0 如果r不存在,並設置RSTART的值和RLENGTH。注意 參數順序與〜運算符:str_re相同。 如果提供數組a,則清除a,然後元素1到n是 ,其中填充了與r中的對應的加括號子表達式匹配的s部分。 a的第0個元素包含與整個正則表達式r匹配的s的 部分。下標 a [n,「start」]和[n,「length」]分別爲每個匹配子字符串提供 字符串和長度的起始索引。

SUBSTR(S,I [,N])

返回起始於I S的至多n個字符的串。如果n省略了 ,則使用其餘的s。

分裂(S,A [,R])

拆分字符串s插入正則表達式r處的陣列的,和 返回字段的數目。如果r省略,則使用FS。首先清除 數組a。如上所述,分裂的行爲與分割領域 相同。

所以當比賽發現,在該線($0)匹配/root=[^,]*/它將返回那個位置的東西(非零整數是真理-Y用於AWK)和動作將被執行。

動作然後使用RSTARTRLENGTH如通過match設置爲獲得該行的匹配子串(減去root=因爲+5/-5的),然後分割該到陣列N:並保存的字段數分成n

這可能會更改爲match($0, /root=([^,]*)/, N)作爲模式,然後在操作中使用N[1,"start"]而不是substr(如果需要)。

+0

謝謝你,很好的答案,但當我們說我把RSTART設置爲+10和RLENGTH爲-10時,會發生什麼變化? – howdoesthiswork 2014-10-29 13:48:21

+0

從'man awk' - > match()匹配的第一個字符的索引;如果不匹配,則爲0。 (這意味着字符索引從1開始) – fedorqui 2014-10-29 13:50:43

+0

@howdohiswork給它們賦值或者用這些值來改變偏移量?我會假設你是指改變偏移量。在這種情況下,來自'substr'的​​結果將在5個字符後開始到匹配的字符串中。嘗試一下,找出答案。'印刷substr($ 0,RSTART + 10,RLENGTH-10)' – 2014-10-29 13:54:26