【问题标题】:How do I use a variable in a grep with groovy?如何在 grep 中使用 groovy 中的变量?
【发布时间】:2010-09-25 22:09:30
【问题描述】:

我需要使用 grep 查找具有一堆名称的行,例如来自 file.txt 的 clientLogin=a@yahoo.comclientLogin=b@gmail.com

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)} 必须在 " " 内, 即:

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']

感谢您的意见。

【问题讨论】:

    标签: groovy grep


    【解决方案1】:

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

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

       "${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 ]
      

      【讨论】:

        【解决方案3】:

        您已经在使用 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)”的确切行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-01-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-02
          • 1970-01-01
          • 2023-01-17
          相关资源
          最近更新 更多