2017-09-22 37 views
0

我有以下字符串是從能分析一個網站,這將是一個bug修正分析尋找在bash shell中提取字符串

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,但它可能是任何東西。

這在內部運行的系統上,並用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/[email protected]/name= 
Hash`sha1/name=Server`bigfix01/name=CustomActions`Enable 
/name=LicenseAllocation`999999/name=CustomRetrievedProperties`Enable: 
170702212459Z:270630212459Z:unable to get local issuer certificate 

提前感謝的另一個例子。 新手在shell編程,但學習!

+0

你所說的「提取物」是什麼意思?你想知道'sha256WithRSAEncryption'或'sha384withRSAEncryption'是否在字符串中,或​​者你想提取該字符串後面的值?請澄清。 – Mecki

+0

你還記得[這](https://stackoverflow.com/questions/46370872/extracting-just-the-open-port-numbers-from-netstat-o​​utput#comment79701789_46370872)發佈? – Cyrus

+0

是..我想提取sha256WithRSAEncryption或任何值是在文本 – fossl

回答

2

你需要最好的方法,但似乎沒有提供最好的描述 - 「這可能是任何類似sha384withRSAEncryption或其他東西。」 所舉的例子,你正在尋找的字符串是4時:是分離的,所以命令應該是OK:

cut -f4 -d":" 

如果輸出字符串有嚴格的長度格式,一個容易的選擇是用-c選擇'cut'命令。儘管有一個端口號,但情況並非如此。 CERT_SUMMARY:127.0.0.1:127.0.0.1:631:sha256WithRSAEncryption:

+0

正確的方法,但它是第五場,而不是第四場。 –

1

正如@cyrus指出的,這很簡單,就像用awk選擇右列一樣簡單......我正在學習。 這工作

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

感謝您的幫助!

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/[email protected]/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「替換」操作的一部分,我只用第二個捕獲組捕獲的內容替換整個字符串(圓括號中的所有內容都是捕獲組)。

0

因此,如果您INPUT_FILE的SHA256位置有點這裏有太多比出一個那麼這可能是更多的幫助太可否請你用下面還,不打印它通過現場的電話號碼。

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

管道輸出到:

awk ‘BEGIN{FS=「:」} {print $5}’ 
0

你可以ALSA退一步OpenSSL的X​​509 ommand '名稱的選項'。使用sep_comma_plus避免了輸出中的斜線,因此你的正則表達式會更簡單。