关于使用 find、grep FreeBSD 2.5.1 和从返回结果中返回文件名的问题

问题描述

这感觉像是一个超级具体的用例,但仍在寻找想法。

  1. 我正在一台返回大量结果的机器上运行 /usr/bin/security find-certificate -a -c $USER -Z -p /Library/Keychains/System.keychain 命令。
  2. 这会返回一个巨大的证书信息文件,但我想出了一种基于 -----BEGIN CERTIFICATE----- 拆分该文件方法,并将这些证书中的每一个放入以单词 cert 开头的单独文件中,例如 { {1}}、certaa 等等
  3. 然后我对工作目录中以单词 certbb 开头的任何文件运行 find 命令,这些文件应该是所有文件,然后对每个返回的文件运行 openssl x509 命令,如下所示:{ {1}}
  4. 我正在将这些结果传递给 grep,因为我只需要查看带有“Not After”的信息,该信息告诉我证书的到期日期
  5. grep 的命令和管道工作并返回我正在查找的结果并显示行号,但它不返回找到结​​果的文件名。

我确实看到您可以包含应该显示文件名的 -H 或 cert 参数,但它没有,它只显示 find . -name "*cert" -type f -exec openssl x509 -text -noout -in {} \; | grep -n "Not After" 而不是文件名。我猜是因为它是 find 命令和返回结果的标准输入。我需要找到文件名,因为我需要知道哪个证书已过期以及我需要删除哪个证书。

希望超级复杂的解释有意义。基本上,我正在寻找一种方法让返回的结果显示 grep 结果返回的文件名,而不是标准输入。

解决方法

使用带有 find ... -exec 的复杂命令会很快变得混乱。如果文件都在一个目录中,那么使用这样的东西怎么样:

for certfile in cert*; do
    openssl x509 -text -noout -in "$certfile" | 
        sed -n "/Not After/ s/^/$certfile:/p"
done

说明:由于循环的内容在完整的 shell 中运行(不仅仅是像 find -exec 那样简单的命令),您可以随意使用和操作变量 ($certfile)。 sed 命令跳过打印大部分文件(-n 选项),但在包含“Not After”的行上,它将行的开头 (^) 替换为文件名和一个冒号,然后打印该行。