解析字符串(.crt文件)

时间:2013-06-27 21:02:51

标签: bash parsing shell scripting

基础知识:我有一个.crt文件(认证授权文件),他由许多字段组成,但在一行中恢复这个问题,我有这个:

    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

有一会儿我在正确的列中得到了它,但是当我没有使用emailAddress时,我的解析失败了,然后我在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

1 个答案:

答案 0 :(得分:0)

这样的事可能有用:

CN=$(openssl x509 -in /path/to/your.crt -noout -subject |
       sed -r 's|.*CN=(.*)|\1|; s|/[^/]*=.*$||')

在Perl中执行此操作会更容易,因为与sed不同,Perl可以执行非贪婪的匹配:

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