使用 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/
的输入)作为示例输入和处理该输入后您想要的预期输出,那么我我确定有人可以帮助您。
我对 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/
的输入)作为示例输入和处理该输入后您想要的预期输出,那么我我确定有人可以帮助您。