這裏我有我的awk代碼的一部分來解析文件,但輸出不是我想要的100%。這段代碼做了什麼? (awk)
match($0,/root=[^,]*/){
n=split(substr($0,RSTART+5,RLENGTH-5),N,/:/)
我的問題是,我不能100%,這是什麼一段代碼究竟做什麼...... 有人能告訴我這是什麼兩行究竟知道?
編輯: 我只是想知道代碼的作用,所以我可以自己修復它,所以請不要問這樣的問題:你解析的文件是怎麼樣的? ..
這裏我有我的awk代碼的一部分來解析文件,但輸出不是我想要的100%。這段代碼做了什麼? (awk)
match($0,/root=[^,]*/){
n=split(substr($0,RSTART+5,RLENGTH-5),N,/:/)
我的問題是,我不能100%,這是什麼一段代碼究竟做什麼...... 有人能告訴我這是什麼兩行究竟知道?
編輯: 我只是想知道代碼的作用,所以我可以自己修復它,所以請不要問這樣的問題:你解析的文件是怎麼樣的? ..
匹配(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)和動作將被執行。
動作然後使用RSTART
和RLENGTH
如通過match
設置爲獲得該行的匹配子串(減去root=
因爲+5
/-5
的),然後分割該到陣列N
上:
並保存的字段數分成n
。
這可能會更改爲match($0, /root=([^,]*)/, N)
作爲模式,然後在操作中使用N[1,"start"]
而不是substr
(如果需要)。
謝謝你,很好的答案,但當我們說我把RSTART設置爲+10和RLENGTH爲-10時,會發生什麼變化? – howdoesthiswork 2014-10-29 13:48:21
從'man awk' - > match()匹配的第一個字符的索引;如果不匹配,則爲0。 (這意味着字符索引從1開始) – fedorqui 2014-10-29 13:50:43
@howdohiswork給它們賦值或者用這些值來改變偏移量?我會假設你是指改變偏移量。在這種情況下,來自'substr'的結果將在5個字符後開始到匹配的字符串中。嘗試一下,找出答案。'印刷substr($ 0,RSTART + 10,RLENGTH-10)' – 2014-10-29 13:54:26