我需要在文件中找到pgp加密的消息。它们以-----BEGIN PGP MESSAGE-----开头,以-----END PGP MESSAGE-----结尾。
到目前为止我有这个:

$ tail -200 somefile | awk '/-----BEGIN PGP MESSAGE-----/,/-----END PGP MESSAGE-----/'

它找到了所有的事件,但我只想要最后一个。

最佳答案

您可以使用sed:

tail -200 somefile | sed -n '
  # only consider lines between BEGIN and END
  /-----BEGIN PGP MESSAGE-----/,/-----END PGP MESSAGE-----/ {
    # if the beginning line, clear the hold space
    /-----BEGIN PGP MESSAGE-----/{x;d}
    # add the line to the hold space
    H
  };
  # print the hold space at the end
  ${x;p}'

此sed注释(注释用于解释,在实际命令中不需要),将“begin”和“end”之间的任何行添加到保留空间,保留空间在每个“begin”上清除,然后在结尾打印。
编辑:
为了完整起见,这里的版本没有注释,只有一行(同上)
tail -200 somefile | sed -n '/-----BEGIN PGP MESSAGE-----/,/-----END PGP MESSAGE-----/{/-----BEGIN PGP MESSAGE-----/{x;d};H};${x;p}'

关于linux - 如何在文本中搜索多行模式并获得最后的出现?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19918642/

10-13 05:13