English 中文(简体)
我如何在Groovy中使用变量进行grep操作?
原标题:
  • 时间:2008-12-08 19:43:20
  •  标签:

我需要在文件.txt中使用grep查找一堆名称,例如clientLogin=a@yahoo.comclientLogin=b@gmail.com

file.txt 中有垃圾,其中包括 email=a@yahoo.com email=b@gmail.com。我需要将它们过滤掉。

一旦我得到这些行,我需要使用grep查找gmail和yahoo并获取它们的计数。

List l = new ArrayList{a@yahoo.com, b@gmail.com}
def gmail = [ sh , -c , grep "clientLogin="$l.get(0) file.txt  | grep gmail | wc -l ]
def yahoo = [ sh , -c , grep "clientLogin="$l.get(1) file.txt  | grep yahoo| wc -l ]

这个不起作用。我该如何动态替换 $l.get(1) 的值?


the problem is that ${l.get(0)} has to be inside the " ", i.e.:

def gmail = [ sh , -c , grep "clientLogin=${l.get(0)}" file.txt  | grep gmail | wc -l ]

以便它看起来像:

def gmail = [ sh , -c , grep "clientLogin=a@yahoo.com" file.txt  | grep gmail | wc -l ]

但是clientLogin=${l.get(0)}没有产生结果。我不确定我哪里出错了。

谢谢你的建议,但是它没有产生结果,至少在我尝试的时候。


file.txt 里有很多垃圾和某种模式,类似于:

Into the domain clientLogin=a@yahoo.com exit on 12/01/2008 etc..

因此我这么做。

def ex = [ sh , -c , grep "domain clientLogin=$client" file.txt | grep "something more" | wc -l]

这样我就可以随心所欲地链接grep,最终得到我需要的数量。

我不确定如果我使用能否链接 greps。

def ex = [ grep , "$client",  file.txt ]

谢谢你的意见。

问题回答

你已经在使用Groovy,使用一条给出答案的正则表达式可以吗?

def file = new File("file.txt")    
file.delete() // clear out old version for multiple runs
file <<  """
foobar clientLogin=a@yahoo.com baz quux   # should match a@yahoo.com
foobar email=a@yahoo.com baz quux
foobar email=b@gmail.com bal zoom
foobar clientLogin=a@yahoo.com baz quux   # should match a@yahoo.com
foobar clientLogin=b@gmail.com bal zoom   # should match b@gmail.com
foobar email=b@gmail.com bal zoom
"""

def emailList = ["a@yahoo.com", "b@gmail.com"]
def emailListGroup = emailList.join( | )
def pattern = /(?m)^.*clientLogin=($emailListGroup).*$/

def resultMap = [:]

(file.text =~ pattern).each { fullLine, email ->
    resultMap[email] = resultMap[email] ? resultMap[email] + 1 : 1
}

assert resultMap["a@yahoo.com"] == 2
assert resultMap["b@gmail.com"] == 1

对我来说,这比尝试为进程脱壳并使用它更清洁,而且它只会选择你要寻找的包含“clientLogin =(email)”的准确行。

我不确定你需要 sh 和 -c。我能让它工作:

def client =  foo@bar.com 
def ex = [ grep , "$client",  file.txt ]

def proc = ex.execute()
proc.waitFor()

println "return: ${proc.exitValue()}"
println "stderr: ${proc.err.text}"
println "stdout: ${proc.in.text}"

Groovy的文档也可以帮助你实现这个。

您需要在变量表达式周围使用 {} 。也就是:

 "${l.get(0)}"

请查看Groovy字符串文档获取更多信息。

完整示例:

List l = new ArrayList{a@yahoo.com, b@gmail.com}
def gmail = [ sh , -c , grep "clientLogin="${l.get(0)} file.txt  | grep gmail | wc -l ]
def yahoo = [ sh , -c , grep "clientLogin="${l.get(1)} file.txt  | grep yahoo| wc -l ]




相关问题
热门标签