Как использовать переменную в grep с groovy? - PullRequest
3 голосов
/ 08 декабря 2008

Мне нужно grep для строк с кучей имен, скажем clientLogin=a@yahoo.com, clientLogin=b@gmail.com из файла .txt.

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


проблема в том, что $ {l.get (0)} должен быть внутри "", 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, как я хочу, и в конечном итоге приземлиться на счет, который мне нужен.

Я не уверен, смогу ли я зацепить зацепки, если я использую

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

спасибо за ваш вклад.

Ответы [ 3 ]

5 голосов
/ 09 декабря 2008

Вы уже используете 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)», которые вы ищете.

2 голосов
/ 08 декабря 2008

Я не уверен, что вам нужны '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 также может помочь вам в этом.

0 голосов
/ 09 декабря 2008

Вам нужно {} вокруг выражения переменной. То есть:

 "${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 ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...