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

Create columns using sed data (bash only)

我对 bash 文本编辑命令比较陌生,正在努力提高自己的技能,所以请多多包涵!

我正在寻找一个简单的命令序列来定位我平台上的所有 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:' | 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

直列是理想的,但不是我最初的目标-现在我真的只是想了解如何提高我的流处理技能,肯定有一种说法:

Use output from last command, collapse the line breaks, replace with "tab", add linefeed, move onto next.

有没有人可以提供一些建议?迄今为止的尝试导致了一些噩梦般的输出 - 如果这不会增加混乱,我会添加一个例子!

感谢各位读者!

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

你可以在-exec sh -c ' .... '

里面修改如下
-exec sh -c 'file="${0##*/}"; path="${0%/*}"; expiry=$(openssl x509 -enddate -noout -in "[=10=]" | sed "s/notAfter=//");  echo "$path $file $expiry"' {} \;
  • file="${0##*/}"; - 获取文件名

  • path="${0%/*}"; -获取路径

  • expiry=$(openssl x509 -enddate -noout -in "[=15=]" | sed "s/notAfter=//"); - 获取有效期

  • echo "$path $file $expiry" - 在末尾打印所有变量

It will become :

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 "[=11=]" | sed "s/notAfter=//");  echo "$path $file $expiry"  ' {} \;

以下正是您所要求的 (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'

但是与仅使用一个脚本完成所有操作相比,向管道添加另一个命令并不是一个好方法。如果您问一个新问题,并且 post seds 管道之前的脚本部分的输出(即 sed s/notAfter=// | sed -r 's:/([a-Z0-9._-]*)$:\r\n:' | sed 's/GMT/&\n/ 的输入)作为示例输入和处理该输入后您想要的预期输出,那么我我确定有人可以帮助您。