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中跳出-),跳过所有内容直到下一个逗号,并在逗号之间捕获下两个字段。

相关问题