2017-08-07 16 views
2

:SSL証明書の情報を返しますGrepのPerlの正規表現とキャプチャグループ

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

。私はgrep -Pにしようとしていますが、1)適切な正規表現を見つけ出すことに問題があります.2)実際にGrepに戻す方法は2つあります。これまでの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) 

は、私はこれらのregexsの両方を試してみた:

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

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

は基本的に、私は、証明書自体を返すようにしたい、ではありません----BEGIN CERTIFICATE---------END CERTIFICATE-----

私はおそらく正規表現を行うには良い方法があると知っていますが、私はそれを試してみました。(それは動作します)regexr.comregex101.com

はgrepはecho $1戻っている何もしない、正常にキャプチャされた場合。

+0

'grep -v-file'? – Cyrus

+0

私はさらに明確にする必要があります。その 'openssl'コマンドを実行すると大量のデータが吐き出されます。データの「ブロック」の1つは証明書情報です。 'grep -v'を使うと証明書情報があれば動作しますが、残念ながらそこにはありません。より具体的に私の投稿を編集します。 – Patrick

+2

問題は 'grep'は一度に1行しか見ないということです。キャプチャもしません。 – Schwern

答えて

6

ここにはgrepというコマンドがあります。このコマンドはcertだけを抽出しますificate:

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

トリックは-n/--null-dataオプションを(行が\0、ない改行で終了している)を使用することです。また、我々は最終的にマッチしたシーケンス(私たちは--BEGIN...\n後と-...前に一部のみを必要とする)に含まれていない任意の以前にマッチした文字を引き起こしPCREとPCREの特別なエスケープシーケンス、the reset match start \Kを、使用しています。

head -c-1古いgrep S(例えばGNU grep v2の改行で非常に最後の文字を削除します。12)およびのヌルバイトの新しいgrep(たとえばGNU grep v2.25)です。

+0

私は、 '| grep .'で空行を削除します。 – Cyrus

+0

どういう意味ですか?どのような空白行ですか? – randomir

+0

GNU grep 2.6.3には、末尾に空白行があります。 – Cyrus

6

私は、これは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 
+0

素晴らしい、ありがとう!それはファイルで作業したようです。私は代わりにこれを行うPerlスクリプトを取得しようとするかもしれません。あなたの助けに感謝! – Patrick

1

使用sed

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

EDIT: 不在 "CERTIFICATE"

または使用のawk:のためだけ

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