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

时间:2013-04-22 20:38:01

标签: linux grep

我正在寻找下面的文件中的模式。在这个例子中,我需要grep一个字符串mgrpRFC822MailMember: foo.foo2@example.com

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

test-d@example.com

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

这并非总是如此。它可以是mgrpRFC822MailMember: foo.foo2@example.com

之前的任何数字

以下是条件:

  1. grep for the string - mgrpRFC822MailMember: foo.foo2@example.com

  2. 如果匹配,请在此行上方查找FIRST dn:行,仅打印test-d@example.com

  3. 非常感谢任何帮助。

    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
    

2 个答案:

答案 0 :(得分:1)

awk '/dn: /{bar=$2} /MailMember:/{print bar}' FS='[=,]'
  • 寻找dn: 
  • 将行保存为bar变量
  • 寻找MailMember:
  • 打印bar变量

答案 1 :(得分:1)

您也可以使用速度更快的sed。将以下内容放入文件中,例如x.sed,不要添加任何空格或标签

/dn:/h
/MailMember:/{
g
s/.*RoutingAddress.//
s/,.*//p
}

然后像这样运行sed

sed -n -f x.sed filename

对于您的示例,它打印出来

test-d@example.com