2017-09-05 28 views
1

我對bash文本編輯命令比較陌生,並且正在嘗試提高我的技能,所以請耐心等待!使用sed數據創建列(僅限bash)

我正在尋找寫一個簡單的命令序列來查找我的平臺上的所有SSL證書,我的理想輸出將是三列的路徑,文件名和過期。

OK到目前爲止,我有這樣的事情:

sudo find/-type f \(\(-name "*.pem" -o -name "*.crt" \) ! -path "/unwanted/search/location/*" \) -exec sh -c 'echo {}; true' \; -exec openssl x509 -enddate -noout -in {} \; | sed s/notAfter=// | sed -r 's:/([a-Z0-9._-]*)$:\r\n\1:' | sed 's/GMT/&\n/' 

這將產生一個可用輸出(上午我花了一些擺弄得功能)。下面是一些例子輸出:

/etc/pki/tls/certs 
gogs.crt 
Feb 8 23:59:59 2018 GMT 

/etc/pki/tls/certs 
sample.crt 
Jan 18 23:59:59 2018 GMT 

最後的問題的時候 - 我應該利用重新格式化下列哪種工具:

/etc/pki/tls/certs gogs.crt Feb 8 23:59:59 2018 GMT 
/etc/pki/tls/certs sample.crt Jan 18 23:59:59 2018 GMT 

直柱是理想的,但不是我最初的目標 - 現在我真的只是想了解如何提高我的流處理技能,當然必須有一種說明方式:

使用上次命令的輸出,摺疊換行符,替換爲「tab」,添加li nefeed,繼續前進。

有人能提供一些建議嗎?迄今爲止的嘗試已經導致了一些惡夢般的輸出 - 如果這不會增加混亂,我會添加一個例子!

感謝讀者!

回答

3

您可以修改像下面裏面-exec sh -c ' .... '

-exec sh -c 'file="${0##*/}"; path="${0%/*}"; expiry=$(openssl x509 -enddate -noout -in "$0" | sed "s/notAfter=//"); echo "$path $file $expiry"' {} \; 
  • file="${0##*/}";- 獲取文件名

  • path="${0%/*}";- 獲取路徑

  • expiry=$(openssl x509 -enddate -noout -in "$0" | sed "s/notAfter=//");- 獲取到期日

  • echo "$path $file $expiry"- 打印所有變量在年底

它將成爲:

sudo find/-type f \(\(-name "*.pem" -o -name "*.crt" \) ! -path "/unwanted/search/location/*" \) -exec sh -c 'file="${0##*/}"; path="${0%/*}"; expiry=$(openssl x509 -enddate -noout -in "$0" | sed "s/notAfter=//"); echo "$path $file $expiry" ' {} \; 
+0

注意:我不是100%確定我從哪裏買的,但是afair $ 0不能保證能夠像這樣工作。通常你會使用這樣的技巧:'-exec bash -c'...' - {} \;'然後以'$ 1'的方式訪問文件名。 (在這種情況下'$ 0'將是'--') – hek2mgl

+0

從[bash手冊](https://www.gnu.org/software/bash/manual/html_node/Positional-Parameters.html):位置參數是一個參數用一個或多個數字表示,而不是單個數字0 – hek2mgl

+0

POSIX中描述:http://pubs.opengroup.org/onlinepubs/009695399/utilities/sh.html – hek2mgl

1
your command|awk 'NF{ORS=(NR%3?FS:RS);print}'|column -t 
+1

你爲什麼要用'awk'兩次? – hek2mgl

+0

這真的很棒,謝謝。我必須找出一些時間來正確解析你所寫的內容,然後才能聲明理解它,但輸出結果是理想的。 – puppyFlo

+0

除了@ hek2mgls點之外,您還需要一個生成製表符分隔輸出的命令,而上述內容不會生成製表符分隔的輸出,因此它如何能夠真的很棒?當文件名包含空格時,它也會失敗。 –

3

的下面正是做你問什麼(Use output from last command, collapse the line breaks, replace with "tab", add linefeed, move onto next.):

awk -v RS= -F'\n' -v OFS='\t' '{$1=$1}1' 

但添加另一個命令添加到您的管道是不是一個偉大的方式VS只用一個腳本來完成這一切。如果你問一個新的問題,並將你的腳本部分的輸出發佈到seds流水線之前(即輸入爲sed s/notAfter=// | sed -r 's:/([a-Z0-9._-]*)$:\r\n\1:' | sed 's/GMT/&\n/)作爲樣本輸入和處理該輸入後所需的預期輸出,然後我確定有人可以幫助您。

+1

感謝您的建議 - 我需要一些時間來研究awk如何解釋您的指令,但它肯定會做到這一點。非常感謝您的時間和建議! – puppyFlo