代码之家  ›  专栏  ›  技术社区  ›  puppyFlo

使用sed数据创建列(仅限bash)

  •  1
  • puppyFlo  · 技术社区  · 9 年前

    我希望编写一个简单的命令序列来定位我平台上的所有SSL证书,理想的输出是路径、文件名和有效期的三列。

    好的,到目前为止,我有这样的东西:

    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
    

    有人能提供一些建议吗?尝试约会已经造成了一些噩梦般的结果——如果这不会增加混乱的话,我会添加一个例子!

    感谢读者!

    3 回复  |  直到 9 年前
        1
  •  3
  •   Akshay Hegde    9 年前

    你可以在里面修改如下 -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"  ' {} \;
    
        2
  •  3
  •   Ed Morton    9 年前

    以下内容正符合您的要求( 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'
    

    sed s/notAfter=// | sed -r 's:/([a-Z0-9._-]*)$:\r\n\1:' | sed 's/GMT/&\n/ )作为示例输入和处理该输入后所需的预期输出,我相信有人可以帮助您。

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