3

我需要从file.txt中查找具有一堆名称的行,例如clientLogin=a@yahoo.comclientLogin=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 并最终达到我需要的计数。

如果我使用,我不确定是否可以链接 greps

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

感谢您的输入。

4

3 回答 3

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)”的确切行。

于 2008-12-09T06:09:49.240 回答
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 的文档也可以为您提供帮助。

于 2008-12-08T20:01:36.363 回答
0

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

 "${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 ]
于 2008-12-08T22:49:08.567 回答