【问题标题】:Looking for the best way in bash shell to extract a string寻找 bash shell 中提取字符串的最佳方法
【发布时间】:2018-03-04 13:13:06
【问题描述】:

我从正在分析网站上的证书的程序中导出以下字符串,这将是错误修复分析的一部分

CERT_SUMMARY:127.0.0.1:127.0.0.1:631:sha256WithRSAEncryption:
/O=bfcentos7-test/CN=bfcentos7-test/emailAddress=root$bfcentos7-
test:/O=bfcentos7-test/CN=bfcentos7-test/emailAddress=root$bfcentos7-
test:170902005715Z:270831005715Z:self signed certificate

(将上面的输出视为单行)

我需要的是在 bash shell 中提取sha256WithRSAEncryption 的最佳方法。这可以是 sha384withRSAEncryption 之类的任何东西或其他东西。

CERTSUMMARY 之后,它总是在其端口631 之上的127.0.0.1:127.0.0.1:portnum,但它可以是任何东西。

这在系统内部运行并返回此字符串以及 SSL 或 TLS(未图示)

这是另一个返回的例子

CERT_SUMMARY:127.0.0.1:127.0.0.1:52311:sha256WithRSAEncryption:
/CN=ServerSigningCertificate_0/name=Type`Administrator
/name=DBName`ServerSigningCertificate_0:/C=US/CN=BLAHBLAH/
ST=California/L=Address, Emeryville CA 94608/O=IBM BigFix Evaluation 
License/OU=Customer/emailAddress=blahblay@gmail.com/name=
Hash`sha1/name=Server`bigfix01/name=CustomActions`Enable
/name=LicenseAllocation`999999/name=CustomRetrievedProperties`Enable:
170702212459Z:270630212459Z:unable to get local issuer certificate

提前致谢。 shell编程的新手,但正在学习!

【问题讨论】:

  • “提取”是什么意思?您想知道sha256WithRSAEncryptionsha384withRSAEncryption 是否在字符串中,或​​者您想提取该字符串后面的值?请澄清。
  • 你还记得this发帖吗?
  • 是的.. 我想提取 sha256WithRSAEncryption 或文本该部分中的任何值
  • awk -F ":" '/CERT_SUMMARY/ {print $5}' file?
  • @cyrus 真的像用 awk 选对列一样简单吗?

标签: string bash parsing awk grep


【解决方案1】:

您还可以退回到 openssl x509 命令“名称选项”。使用 sep_comma_plus 可以避免输出中的斜线,因此您的正则表达式会更简单。

【讨论】:

    【解决方案2】:

    管道输出到:

    awk ‘BEGIN{FS=“:”} {print $5}’
    

    【讨论】:

      【解决方案3】:

      您能否也使用以下内容,而不是按字段编号打印它,所以如果您的 Input_file 的 sha256 位置有点在这里和那里也比显示的位置,那么这也可能更有帮助。

      awk '{match($0,/sha.*Encryption:/);if(substr($0,RSTART,RLENGTH)){print substr($0,RSTART,RLENGTH-1)}}'  Input_file
      

      【讨论】:

        【解决方案4】:
        | sed -E 's/^([^:]*:){4}([^:]*):.*/\2/'
        

        正则表达式是你的朋友。如果有一件事情真的应该熟悉,如果需要做大量的字符串解析或字符串处理,那肯定是正则表达式。

        echo 'CERT_SUMMARY:127.0.0.1:127.0.0.1:52311:sha256WithRSAEncryption:
        /CN=ServerSigningCertificate_0/name=Type`Administrator
        /name=DBName`ServerSigningCertificate_0:/C=US/CN=BLAHBLAH/ST=California
        /L=Address, Emeryville CA 94608/O=IBM BigFix Evaluation 
        License/OU=Customer/emailAddress=blahblay@gmail.com/name=Hash`sha1
        /name=Server`bigfix01/name=CustomActions`Enable
        /name=LicenseAllocation`999999
        /name=CustomRetrievedProperties
        `Enable:170702212459Z:270630212459Z:unable to get local issuer 
        certificate' 
        | sed -E 's/^([^:]*:){4}([^:]*):.*/\2/'
        

        打印

        sha256WithRSAEncryption
        

        这里可能有点矫枉过正,但几乎没有什么是正则表达式无法完成的,而且由于您今天在许多语言中还内置了正则表达式支持,所以知道正则表达式永远不会浪费时间。

        另请参阅here,以很好地解释每个正则表达式的实际含义,包括交互式编辑视图。基本上,我告诉正则表达式解析器跳过前 4 组,其中包含任意数量的非 : 字符,然后是单个 :,然后捕获包含任意数量的非字符的第 5 组: 最后将其他任何内容(无论如何)匹配到字符串的末尾。整个正则表达式是 sed “替换”操作的一部分,我将整个字符串替换为仅由第二个捕获组捕获的内容(圆括号中的所有内容都是一个捕获组)。

        【讨论】:

          【解决方案5】:

          正如@cyrus 指出的那样,这就像用 awk 选择正确的列一样简单......我正在学习。 这有效

          awk -F ":" '/CERT_SUMMARY/ {print $5}'
          

          感谢您的帮助!

          【讨论】:

            【解决方案6】:

            您需要最好的方法,但似乎没有提供最好的描述 - “这可能是 sha384withRSAEncryption 或其他任何东西。” 给定示例,您要查找的字符串是第 4 个,当 : 是分隔符时,因此命令应该可以:

            cut -f4 -d":"
            

            如果输出字符串具有严格的长度格式,一个简单的选项是带有 -c 的 'cut' 命令。但情况并非如此,因为有一个端口号。 CERT_SUMMARY:127.0.0.1:127.0.0.1:631:sha256WithRSAEncryption:

            【讨论】:

            • 正确的方法,但它是第 5 个字段,而不是第 4 个字段。
            猜你喜欢
            • 2011-11-21
            • 2010-09-10
            • 1970-01-01
            • 2014-10-02
            • 2013-03-01
            • 2012-03-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多