2017-06-18 131 views
2

尋找解決方案,在Lua替換以下命令:Lua。在文件中搜索字符串,並打印第二列

grep "dhcp-range" /tmp/etc/dnsmasq.conf | awk -F "\"*,\"*" '{print $2}' 

試圖

for line in file:lines() do 
     if line:match("([^;]*),([^;]*),([^;]*),([^;]*),([^;]*)") then 
       print(line[2]) 
     end 
end 

,它不工作。

/tmp/etc/dnsmasq.conf看起來像這樣

dhcp-leasefile=/tmp/dhcp.leases 
resolv-file=/tmp/resolv.conf.auto 
addn-hosts=/tmp/hosts 
conf-dir=/tmp/dnsmasq.d 
stop-dns-rebind 
rebind-localhost-ok 
dhcp-broadcast=tag:needs-broadcast 

dhcp-range=lan,192.168.34.165,192.168.34.179,255.255.255.0,12h 
no-dhcp-interface=eth0 
+1

請爲樣本輸入添加樣本輸入和您想要的輸出到您的問題。 – Cyrus

+0

'[^;] *'匹配0或更多字符,而不是'; - 爲什麼如果你的輸入沒有分號就使用它?你想在Lua中獲得什麼輸出? –

+0

如果您需要獲得'192.168.34.165',請檢查https://ideone.com/s1U60B。 –

回答

2

這裏是在Lua的功能,將打印,如果你通過整個文件內容,它需要的值:

function getmatches(text) 
    for line in string.gmatch(text, "[^\r\n]+") do 
     m,n = string.match(line,"^dhcp%-range[^,]*,([^,]+),([^,]+)") 
     if m ~= nil then 
      print(m,n) 
     end 
    end 
end 

Lua demo

隨着string.gmatch(text, "[^\r\n]+"),每個文件行訪問(調整如你所見),然後主要部分是m,n = string.match(line,"^dhcp%-range[^,]*,([^,]+),([^,]+)"),其將m與第一IP和n實例化,第二IP在以dhcp-range開始的線上找到。

的Lua圖案詳細

  • ^ - 串
  • dhcp%-range的開始 - 文字串dhcp-range(一個-是在Lua量詞匹配0或多次出現,但儘可能少,並且匹配一個文字-,它必須被轉義,正則表達式轉義是由%構成的。)
  • [^,]*, - 除之外的0+字符然後,
  • ([^,]+) - 第1組(m):一個或多個字符比,
  • ,其他 - 逗號
  • ([^,]+) - 第1組(n):比,其它的一個或多個字符。
+0

完美地工作。謝謝 –

+0

@BJackson:很高興爲你工作。請考慮接受答案(請參閱[如何接受SO答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)),並且如果我的答案證明對我有幫助,你(見[如何在堆棧溢出?](http://meta.stackexchange.com/questions/173399/how-to-upvote-on-stack-overflow))。 –

0

試試這個代碼:

for line in io.lines() do 
    local a,b=line:match("^dhcp%-range=.-,(.-),(.-),") 
    if a~=nil then 
     print(a,b) 
    end 
end 

模式寫着:比賽dhcp-range=在一行的開始(注意結束在Lua中跳出-),跳過所有內容直到下一個逗號,並在逗號之間捕獲下兩個字段。

相關問題