【问题标题】:Grep Perl Regex and Capture GroupsGrep Perl 正则表达式和捕获组
【发布时间】:2018-01-15 02:54:41
【问题描述】:

我正在尝试使用此命令获取 Ssl 证书信息:

openssl s_client -connect gcm-http.googleapis.com:443

这将返回 SSL 证书信息。我正在尝试grep -P,但无法弄清楚1)正确的正则表达式,以及2)如何让Grep真正返回。到目前为止,带有以下正则表达式的 grep 命令没有返回任何内容。

这是我操作的信息:

(More unrelated data - Truncated)
---
Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.googleapis.com
   i:/C=US/O=Google Inc/CN=Google Internet Authority G2
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
---
Server certificate

-----BEGIN CERTIFICATE-----
MIIE3TCCA8WgAwIBAgIISZPzqn6Rx/0wDQYJKoZIhvcNAQELBQAwSTELMAkGA1UE
BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRl
cm5ldCBBdXRob3JpdHkgRzIwHhcNMTcwNzI1MDgyOTQ0WhcNMTcxMDE3MDgyNzAw
WjBqMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN
TW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEZMBcGA1UEAwwQKi5n
b29nbGVhcGlzLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL50
UZFxROM8NwIcSTC9V6XAJkoCcW+xuLtYFUbP+6zomzzxYXtTjh+s33XvtaHoNk1S
WxBqSX+0YsS1RHzwWT4KwJpkEyrqJ/WDtKs3hQY27Lng6IZmAYomoRXNZBWgXdQ0
sBddBU9/HtpKu0RpL6qM+7y7Xpp8KHilqPfjvtc8eljvOAdU3RA3w1p2JIov+F5n
sbD1bMqq3Xx6wbT7FLhzL8P/+g1NI0DC/fzSqW+pS/RLljQGLJrlvfmrV++i69Yg
pFRHPvTo85171cLjvHNv730SkM4W9SA7oHU+xzmANrT+p/ikcEJrcMnR9pKf08ON
pN9UgsEff7BZE0jvlu0CAwEAAaOCAaYwggGiMB0GA1UdJQQWMBQGCCsGAQUFBwMB
BggrBgEFBQcDAjB0BgNVHREEbTBrghAqLmdvb2dsZWFwaXMuY29tghUqLmNsaWVu
dHM2Lmdvb2dsZS5jb22CGCouY2xvdWRlbmRwb2ludHNhcGlzLmNvbYIWY2xvdWRl
bmRwb2ludHNhcGlzLmNvbYIOZ29vZ2xlYXBpcy5jb20waAYIKwYBBQUHAQEEXDBa
MCsGCCsGAQUFBzAChh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3J0MCsG
CCsGAQUFBzABhh9odHRwOi8vY2xpZW50czEuZ29vZ2xlLmNvbS9vY3NwMB0GA1Ud
DgQWBBRQbPBTOA3tVXQWc4iuJyyz5dGWMzAMBgNVHRMBAf8EAjAAMB8GA1UdIwQY
MBaAFErdBhYbvPZotXb1gba7Yhq6WoEvMCEGA1UdIAQaMBgwDAYKKwYBBAHWeQIF
ATAIBgZngQwBAgIwMAYDVR0fBCkwJzAloCOgIYYfaHR0cDovL3BraS5nb29nbGUu
Y29tL0dJQUcyLmNybDANBgkqhkiG9w0BAQsFAAOCAQEAeClOfrviHl9sZAVSTfYB
5FuIDKeSJHibXtjHSNsUP+JaAB9x1ABDczyLYWD/4PaD2w8jRXPXcVcqUaQPqyjF
1um/H/+Eb8+qfwl+Q3RiBAgGgAPw+s6GZK/kGfF9CNPbwhPXizYS6BZZ880/x3ec
Em0F+i0NbHsufPg4ghtJr2gFC2NWHwhvZtezbQDR2z8ePu1r3hyFwgotefCFsQJv
zAbVOvXsqHZdom3BLVwkANeh5hRfeW04N48bRVMZo9A0cULTg5LM1AOXGeLbp86z
D3RHbwtbRBGp2HUjfpt8FqeMzd+DxGlQXEc7l8aFwOgIFvWRJv+SHCXVT3rRHGD+
wA==
-----END CERTIFICATE-----

....
(More unrelated data - Truncated)

这两个正则表达式我都试过了:

grep -P '((?:-+BEGIN CERTIFICATE-+\n)(.+\n)*(?:-+END CERTIFICATE-+))'

grep -P '(?:-+BEGIN CERTIFICATE-+\n)(.+\n)(?:-+END CERTIFICATE-+)'

基本上,我只想返回证书本身,而不是 ----BEGIN CERTIFICATE---- 和 -----END CERTIFICATE-----

我知道可能有更好的方法来执行正则表达式,但我已经在 regexr.com 和 regex101.com 上对其进行了测试(并且它有效)

如果 Grep 成功捕获它,则执行 echo $1 不会返回任何内容。

【问题讨论】:

  • grep -v - file?
  • 我需要进一步澄清。执行openssl 命令会产生大量数据。数据“块”之一是证书信息。如果只有证书信息,使用grep -v 会起作用,不幸的是没有。我将编辑我的帖子以更具体。
  • 问题是grep 一次只看一行。它也不进行任何捕获。
  • @Schwern 啊,我没有意识到这一点。尤其是“一次一行”的警告可能会阻止此操作。
  • 带 sed:sed -n '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' file | sed '1d;$d'

标签: regex bash perl


【解决方案1】:

我没能用 grep 解决这个问题,但有一个 Perl 解决方案:

perl -0777 -n -e \
    'print $1 if /-+BEGIN CERTIFICATE-+\n(.+\n)*-+END CERTIFICATE-+/s' \
    cert.txt

这将打印第一个“BEGIN...”和最后一个“END...”之间的所有内容。

更新:

@brian d foy 写了an article 关于“独家触发器操作员”。根据那篇文章,这也有效:

perl -n -e \
    'print if ($rc = /-+BEGIN CERTIFICATE/ .. /-+END CERTIFICATE-+/ and $rc !~ /(^1|E0)$/)' cert.txt 

【讨论】:

  • 太棒了,谢谢!这似乎对文件有效。我可能会尝试让 Perl 脚本来代替它。感谢您的帮助!
【解决方案2】:

使用sed:

sed -n '/----BEGIN CERTIFICATE-----/,/----END CERTIFICATE-----/ p' inputfile |
   sed '1d;$d'

编辑: 错过“证书”

或者使用awk:

awk '/----END CERTIFICATE-----/ {pr=0;}
     pr==1 {print}
     /----BEGIN CERTIFICATE-----/ {pr=1;}' inputfile

【讨论】:

    【解决方案3】:

    为了记录,这里有一个grep 命令,它将只提取证书:

    grep -zoPe '--BEGIN.*\n\K[^-]+' file | head -c-1
    

    诀窍是使用-z/--null-data 选项(输入行以\0 终止,而不是换行符)。我们还使用 PCRE 和 PCRE 的特殊转义序列 the reset match start \K,这会导致任何先前匹配的字符不包含在最终匹配的序列中(我们只需要 --BEGIN...\n 和 -... 之前的部分)。

    head -c-1 将删除最后一个字符,这是旧的greps 的 换行符(例如 GNU grep v2.12)和一个 空字节 em> 用于更新的 greps(例如 GNU grep v2.25)。

    【讨论】:

    • 我建议附加| grep . 删除空行。
    • 你是什么意思?什么空行?
    • 使用 GNU grep 2.6.3 有一个尾随空行。
    • 嗯.. 我没有在 GNU grep 2.25 上得到它。但我在 v2.12 上做 .. 好的,我会修复它。谢谢。
    • 工作。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2014-08-31
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多