关于使用 find、grep FreeBSD 2.5.1 以及从返回的结果中返回文件名的问题
Posted
技术标签:
【中文标题】关于使用 find、grep FreeBSD 2.5.1 以及从返回的结果中返回文件名的问题【英文标题】:Question about using find, grep FreeBSD 2.5.1, and returning filenames from returned results 【发布时间】:2021-09-08 04:49:46 【问题描述】:这感觉像是一个超级具体的用例,但仍在寻找想法。
-
我正在一台机器上运行
/usr/bin/security find-certificate -a -c $USER -Z -p /Library/Keychains/System.keychain
命令,它会返回大量结果。
这会返回一个巨大的证书信息文件,但我想出了一种方法来根据-----BEGIN CERTIFICATE-----
拆分该文件并将这些证书中的每一个放入以cert
开头的单独文件中,例如certaa
,@ 987654325@等等等等
然后我对工作目录中以单词 cert
开头的所有文件运行 find 命令,然后对每个返回的文件运行 openssl x509 命令,如下所示:find . -name "*cert" -type f -exec openssl x509 -text -noout -in \; | grep -n "Not After"
我将这些结果传递给 grep,因为我只需要查看带有“Not After”的信息,它告诉我证书的到期日期
grep 的命令和管道可以正常工作并返回我正在查找的结果并显示行号,但它不返回找到结果的文件名。
我确实看到您可以包含应该显示文件名的 -H 或 --show-filename
参数,但它没有,它只显示 standard-input
而不是文件名。我猜是因为它是 find 命令和返回结果的标准输入。我需要找到文件名,因为我需要知道哪个证书已过期以及需要删除哪个证书。
希望超级复杂的解释是有道理的。基本上我正在寻找一种方法让返回的结果显示 grep 结果返回的文件名,而不是标准输入。
【问题讨论】:
那么,你需要grep -l "Not After"
,对吧?
是的,我试过了,当我这样做时,唯一返回的是(standard input)
,甚至不是我返回的结果
可能吗?让我试试。谢谢@rowboat
【参考方案1】:
使用带有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”的行上,它用文件名和冒号替换行的开头 (^
),然后打印行。
【讨论】:
太棒了。谢谢戈登!这似乎可以解决问题以上是关于关于使用 find、grep FreeBSD 2.5.1 以及从返回的结果中返回文件名的问题的主要内容,如果未能解决你的问题,请参考以下文章