![如何使用“cat”在多个文件中搜索?](https://linux22.com/image/928000/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E2%80%9Ccat%E2%80%9D%E5%9C%A8%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD%E6%90%9C%E7%B4%A2%EF%BC%9F.png)
我想要的是在目录中找到所有包含匹配项的文件,当找到匹配项时,它会显示找到该匹配项的文件。
例子
cat * | grep password:
这里会显示所有包含“密码:”的匹配项
但它没有显示匹配属于哪个文件。
答案1
cat
我认为在您将示例中的结果通过管道传输后,不可能获取文件名,因为该cat
命令只会连接内容,此后有关文件名的信息就消失了。
您可以做的是依靠grep
命令在获取多个输入文件时的行为,然后grep
显示每个匹配的文件名。
因此,
cat * | grep password:
你可以这样做:
grep password: *
答案2
使用cat
和grep
打印出当前目录中包含“密码:”字符串的文件的名称:
cat * 2>&- | grep -ls 'password:' *
带有完整文件路径:
cat * 2>&- | grep -ls 'password:' ${PWD}/*
2>&-
用于抑制有关无法读取某些文件/目录的错误消息。
仅使用grep
来做同样的事情:
grep -ls 'password:' *
带有完整文件路径:
grep -ls 'password:' ${PWD}/*
使用grep
模式匹配“密码:”字符串,打印文件名,然后用来cat
显示整个文件的内容:
for match in $(grep -ls 'password:' *) ; do
echo "${match}"
cat "${match}"
done
带有完整文件路径:
for match in $(grep -ls 'password:' *) ; do
echo -e "\e[7m\n$(readlink -f "${match}")\e[0m"
cat "${match}"
done