关于使用 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 以及从返回的结果中返回文件名的问题的主要内容,如果未能解决你的问题,请参考以下文章

linux rhel unix centos FreeBSD 常用命令

linux中“grep”和“find”的区别是啥?

linux中grep和find的区别

Linux grep和find的区别

linux find grep组合使用

Linux下find命令和grep命令查找文件