3

clientLogin=a@yahoo.comたとえば、clientLogin=b@gmail.comfile.txt から一連の名前を持つ行を grep する必要があります。

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 を連鎖させ、最終的に必要な数に到達させることができます。

使用した場合、grepをチェーンできるかどうかわかりません

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)}"

詳細については、 GroovyStringのドキュメントを参照してください。

完全な例:

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 に答える