寻找bash shell中提取字符串

时间:2017-09-22 21:31:26

标签: string bash parsing awk grep

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

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之后,127.0.0.1:127.0.0.1:portnum总是631高于其端口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 ,但它可能是任何东西。

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

这是另一个返回的例子

fmapTwice :: (Functor f) => (a -> a) -> f a -> f a
fmapTwice f = fmap (f . f)

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

6 个答案:

答案 0 :(得分:2)

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

cut -f4 -d":"

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

答案 1 :(得分:1)

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

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

感谢您的帮助!!

答案 2 :(得分:1)

| 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"替换"的一部分。操作,我只用第二个捕获组捕获的内容替换整个字符串(圆括号中的所有内容都是一个捕获组)。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

将输出传输到:

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

答案 5 :(得分:0)

您还可以退回到openssl x509命令'name options'。使用sep_comma_plus可以避免输出中的斜杠,因此正则表达式会更简单。