1

我需要在文件中找到 pgp 加密消息。它们以 开头-----BEGIN PGP MESSAGE-----和结尾-----END PGP MESSAGE-----

到目前为止,我有这个:

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

它正在查找所有事件,但我只想要最后一个。

4

3 回答 3

2
awk '
/-----BEGIN PGP MESSAGE-----/ {
    inBlock = 1
    block = ""
}
inBlock {
    block = block $0 ORS
    if (/-----END PGP MESSAGE-----/) {
        inBlock = 0
    }
}
END {
    printf "%s", block
}
' somefile
于 2013-11-12T00:24:53.540 回答
2

你可以使用 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}'
于 2013-11-12T01:29:19.627 回答
1
BEGIN {
    beginmsg = "-----BEGIN PGP MESSAGE-----"
    endmsg = "-----END PGP MESSAGE-----"
}

$0 ~ beginmsg {
    block = ""
}

beginmsg,endmsg {
    block = block $0 ORS
}

END {
    printf "%s", block
}
于 2013-11-12T02:40:07.220 回答