Linux grep表示字符串,如果匹配,则在匹配行上方查找具有特定单词的行

Linux grep表示字符串,如果匹配,则在匹配行上方查找具有特定单词的行,linux,grep,Linux,Grep,我在一个文件中寻找一个模式,如下所示。在本例中,我需要grep查找字符串mgrpRFC822MailMember:foo。foo2@example.com 如果上面的字符串匹配,则向上查找第一行dn:并打印 test-d@example.com 现在,问题是,dn:行并不总是在同一个数字上(在下面的示例中,dn:行在grep'ed行mgrpRFC822MailMember:foo上方3行)。foo2@example.com) 这并不总是正确的。它可以位于mgrpRFC822MailMember

我在一个文件中寻找一个模式,如下所示。在本例中,我需要grep查找字符串
mgrpRFC822MailMember:foo。foo2@example.com

如果上面的字符串匹配,则向上查找第一行
dn:
并打印

test-d@example.com
现在,问题是,
dn:
行并不总是在同一个数字上(在下面的示例中,
dn:
行在grep'ed行
mgrpRFC822MailMember:foo上方3行)。foo2@example.com

这并不总是正确的。它可以位于
mgrpRFC822MailMember:foo之前的任何数字上。foo2@example.com

条件如下:

  • 字符串的grep-
    mgrpRFC822MailMember:foo。foo2@example.com

  • 如果匹配,则查找此行上方的第一个dn:行,并仅打印
    test-d@example.com

  • 非常感谢您的帮助

    time: 1364633264
    dn: mailRoutingAddress=test-d@example.com,ou=MessageRecipientGroups,dc=example,dc=com
    changetype: modify
    delete: mgrpRFC822MailMember
    mgrpRFC822MailMember: foo.foo2@example.com
    -
    replace: entryCSN
    entryCSN: 20130330084739Z#00000b#00#000000
    -
    replace: modifiersName
    modifiersName: uid=distlist-cleanup,ou=SysAccounts,dc=example,dc=com
    
    awk'/dn:/{bar=$2}/MailMember:/{print bar}'FS='[=,]'
    
    • 查找
      dn:
    • 将行另存为
      bar
      变量
    • 查找
      邮件成员:
    • 打印
      bar
      变量

    您也可以使用sed,这可能会更快。将以下内容放入文件,例如
    x.sed
    ,不要添加任何空格或制表符

    /dn:/h
    /MailMember:/{
    g
    s/.*RoutingAddress.//
    s/,.*//p
    }
    
    然后像这样跑

    sed -n -f x.sed filename
    
    例如,它会打印出来

    test-d@example.com
    

    我认为使用grep无法合理地做到这一点,请尝试使用
    awk
    。当您看到
    dn:
    行时,请将地址保存在变量中,当您看到
    mgrpRFC822MailMember:foo时。foo2@example.com
    打印变量。非常好。。谢谢Marichyasana