我需要grep查找包含大量名称的行,例如来自file.txt的clientLogin=a@yahoo.com
,clientLogin=b@gmail.com
。
file.txt包含email=a@yahoo.com email=b@gmail.com
的垃圾邮件。我需要过滤掉这些
一旦我得到这些行,我需要为gmail和yahoo grep并获得他们的计数
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)}必须在“”内, 即:
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并最终降落在我需要的数量上。
如果我使用
,我不确定是否可以链接grepsdef ex = ['grep', "$client", 'file.txt']
感谢您的意见。
答案 0 :(得分:5)
你已经在使用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)”的确切行。
答案 1 :(得分:2)
我不确定你需要'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's documentation也可以为您提供帮助。
答案 2 :(得分:0)
你需要{}围绕变量表达式。那就是:
"${l.get(0)}"
有关详细信息,请参阅Groovy String文档。
完整示例:
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 ]