Bash 正在分析字符串(.crt文件)

Bash 正在分析字符串(.crt文件),bash,parsing,shell,scripting,Bash,Parsing,Shell,Scripting,基本知识:我有一个.crt文件(certification authoritie文件),他由许多字段组成,但在一行中,我有以下内容: Certificate: ...(alot of stuff before)... Subject: C=US, ST=Maryland, L=Pasadena, O=Brent Baccala, OU=FreeSoft, CN=www.freesoft.org/emailAddress=bacc

基本知识:我有一个.crt文件(certification authoritie文件),他由许多字段组成,但在一行中,我有以下内容:

    Certificate:
       ...(alot of stuff before)...
       Subject: C=US, ST=Maryland, L=Pasadena, O=Brent Baccala,
                OU=FreeSoft, CN=www.freesoft.org/emailAddress=baccala@freesoft.org
       Subject Public Key Info:
          ...(alot of stuff after)
我需要解析文件以填充.csv文件,我已经完成了。我需要帮助的问题是,我需要获取字段:

CN=www.fresoft.org
但是当我用很多斜杠得到这种CN=…(值而不是…)时,我在解析中得到了一个错误,就像原始字符串是:

CN=foo/bar/the/hell/emailAddress=blablabla
我只需要:

foo/bar/the/hell
有一段时间,我在正确的栏中找到了它,但是当我没有电子邮件地址时,我的解析就失败了,然后我在CN.csv栏中得到了错误的信息,而不是错误的信息

|CN|
foo/bar/the/hell
我得到:

|CN|
OU=FreeSoft, foo/bar/the/hell.
我让这段代码进行CN解析:

#!/bin/bash

subject_line=$(echo $cert | grep -o "Subject:.*Subject Public Key Info")

cn=$(echo $subject_line | grep -o "CN=.*" )

if [ $(echo $cn | grep -c ".*email.*") -gt 0 ]; then
    end_cn=$(echo $cn | grep -b -o emailAddress)
    end_cn_idx=$(echo $end_cn | grep -o .*:)
    final_end_cn=${end_cn_idx:0:-1}
    common_name=${cn:3:$final_end_cn-4}

    echo $common_name

else
    end_cn=$(echo $cn | grep -b -o "Subject Public Key Info")
        end_cn_idx=$(echo $end_cn | grep -o .*:)
        final_end_cn=${end_cn_idx:0:-1}
        common_name=${cn:3:$final_end_cn-5}

        echo $common_name
fi

类似的方法可能会奏效:

CN=$(openssl x509 -in /path/to/your.crt -noout -subject |
       sed -r 's|.*CN=(.*)|\1|; s|/[^/]*=.*$||')
不过,在Perl中这样做会更容易,因为与
sed
Perl不同,Perl可以进行非贪婪匹配:

CN=$(openssl x509 -in /path/to/your.crt -noout -subject |
       perl -ne 'print "$1" if m|.*CN=(.*?)(?:/[^/]*?=.*)?$|')

但是如果我在CN=之后没有电子邮件地址,这就不起作用了,对吗?是的。如果该部件是可选的,则必须先将其删除。我更新了我的答案以反映这一点。您好,很抱歉问一下,但是否可以在电子邮件上创建一个数组,如:如果CN=blabla/bla存在[“emailAddress=”,“OU=”,“CT=”,等等],则只解析电子邮件或OU或CT等。在某种程度上,在CN=blabla/blabla之后会出现什么都不重要。。。解析总是正确的,比如:我给他CN=blablabla/bla/OU=YEs/emailAddress=you@you.com我只会得到:blabla/bla或者如果我给他CN=blablabla/bla/CT=URtest/OU=YES/emailAddress=you,我会得到:blablabla/blasmometimes在导入的.crt文件上,我会得到CN=blablabla/bla/emailAddress,有时我会CN=blabla/bla/OU=youknow/email,然后我的.csv解析器在CN列上执行此操作:CN!blabla/bla/OU=你知道,因为正则表达式是从“CN=”开始的直到他找到emailAddress=而不是停在下一个参数中,这只有5个选项,要么是OU,要么是U,要么是CT,要么是Email,要么是L soo,如果我用它做一个数组,我知道他会找到这些参数中的任何一个,如果他发现这些都是好的。非常清楚的是从“CN=”到下一个“=”但是“=”总是有两个我不需要的字符,可以是“emailAddress”或“OU”等。在CN=blabla/bla/OU=i want:blablabla/bla的简历中。或者from CN=blablabla/bla/T=我想要的东西仍然只有“blablabla/bla”或者如果作为最后一个例子(这只是做一个不同的例子):from:CN=blablabla/bla/emailAddress=想要的东西:blablabla/bla