如何在groovy的grep中使用变量?

如何在groovy的grep中使用变量?,groovy,grep,Groovy,Grep,我需要用grep搜索有很多名字的行,比如说clientLogin=a@yahoo.com,客户端登录=b@gmail.com从一个file.txt文件 file.txt包含垃圾邮件,即电子邮件=a@yahoo.com电子邮件=b@gmail.com。我需要把这些过滤掉 一旦我得到这些行,我需要grep的gmail和雅虎,并得到他们的计数 List l = new ArrayList{a@yahoo.com, b@gmail.com} def gmail = ['sh','-c','grep "c

我需要用grep搜索有很多名字的行,比如说
clientLogin=a@yahoo.com
客户端登录=b@gmail.com
从一个file.txt文件

file.txt包含垃圾邮件,即
电子邮件=a@yahoo.com电子邮件=b@gmail.com
。我需要把这些过滤掉

一旦我得到这些行,我需要grep的gmail和雅虎,并得到他们的计数

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)值


问题是${l.get(0)}必须在“”中, i、 e:

所以它看起来像:

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,是否可以链接greps

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

谢谢您的输入。

我不确定您是否需要“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}"

也可以帮助您实现这一点。

您需要变量表达式周围的{}。即:

 "${l.get(0)}"
有关更多信息,请参阅文档

完整示例:

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 ]

您已经在使用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
def file=新文件(“file.txt”)
file.delete()//清除旧版本以进行多次运行
文件
结果映射[电子邮件]=结果映射[电子邮件]?结果映射[电子邮件]+1:1
}
断言结果映射[”a@yahoo.com"] == 2
断言结果映射[”b@gmail.com"] == 1
对我来说,这感觉比尝试使用一个过程更干净,而且它只会挑出您正在寻找的带有“clientLogin=(email)”的确切行

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