我是bash的新手,希望能得到一些建议。
我想在bash中运行命令来cat
在充满文本文件的文件夹中包含特定字符串的所有文件。这些文本文件中包含唯一的代码,因此对文件夹运行此查询以查看其中包含代码abc123
的所有文件会很方便。
所以有点像cat "abc123" | more
吗?
如果没有cat
就可以实现这一目标-也很乐意这样做。
不确定是否有可能,将不胜感激:)
谢谢!
答案 0 :(得分:3)
您可以使用此:
grep -l "abc123" * 2>/dev/null | xargs -d '\n' cat
grep -l <SOMETHING> *
:-l选项返回包含文本SOMETHING的所有文件的文件名。 *
检查当前目录中的所有文件。2>/dev/null
用于禁止grep
上的stdout。没有它,您收到的最经典的消息是“ grep:DIRNAME:是目录”。xargs
,后者将从grep输出中获取文件名,并将命令cat
应用于每一个。 更新:在-d '\n'
命令中添加了xargs
,以正确处理名称中带有空格的文件。
答案 1 :(得分:1)
我会这样使用find
:
find FOLDER -type f -exec grep -q 'abc123' {} \; -exec cat {} \;
答案 2 :(得分:1)
正如我在Nic2500's answer下面的评论中所提到的,执行此操作的安全方法是使用:
grep -lZs "abc123" * | xargs -0 cat
-Z
告诉grep使用空字节而不是换行符作为输出来输出。由于路径中不允许使用空字节,因此这是在命令之间传递文件列表的唯一安全方法。 -s
禁止显示“关于不存在或不可读文件的错误消息”,无需重定向stderr(尽管我认为原则上,您可能希望重定向grep生成的其他类型的错误消息)。>
-0
告诉xargs参数列表由空字节分隔,因此grep -Z
生成的输出可以作为参数列表传递给cat。
也可以使用find
,但是hek2mgl's answer中的命令针对找到的每个文件分别调用grep
和cat
,而此答案中的代码考虑到单个命令行的最大长度,会调用一个grep
和所需的cat
数。