我需要在文件中找到 pgp 加密消息。它们以 开头-----BEGIN PGP MESSAGE-----
和结尾-----END PGP MESSAGE-----
。
到目前为止,我有这个:
$ tail -200 somefile | awk '/-----BEGIN PGP MESSAGE-----/,/-----END PGP MESSAGE-----/'
它正在查找所有事件,但我只想要最后一个。
我需要在文件中找到 pgp 加密消息。它们以 开头-----BEGIN PGP MESSAGE-----
和结尾-----END PGP MESSAGE-----
。
到目前为止,我有这个:
$ tail -200 somefile | awk '/-----BEGIN PGP MESSAGE-----/,/-----END PGP MESSAGE-----/'
它正在查找所有事件,但我只想要最后一个。
awk '
/-----BEGIN PGP MESSAGE-----/ {
inBlock = 1
block = ""
}
inBlock {
block = block $0 ORS
if (/-----END PGP MESSAGE-----/) {
inBlock = 0
}
}
END {
printf "%s", block
}
' somefile
你可以使用 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}'
BEGIN {
beginmsg = "-----BEGIN PGP MESSAGE-----"
endmsg = "-----END PGP MESSAGE-----"
}
$0 ~ beginmsg {
block = ""
}
beginmsg,endmsg {
block = block $0 ORS
}
END {
printf "%s", block
}