将查找结果导入grep,不产生任何结果

将查找结果导入grep,不产生任何结果,grep,find,pipe,Grep,Find,Pipe,这里有一个简单的问题查找-L-路径“*/lef/*.lef”| grep宏不产生任何结果。但是,find-L-路径“*/lef/*.lef”给出结果,并在其中一个结果上运行grep宏,返回匹配项。这里出了什么问题?find返回文件名列表。您将此列表传送到grep,因此您实际要做的是检查 ./lef/sc9mcpp84_14lpp_custom_hvt_c16.lef ./lef/sc9mcpp84_14lpp_custom_hvt_c17.lef ./lef/sc9mcpp84_14lpp_cu

这里有一个简单的问题<代码>查找-L-路径“*/lef/*.lef”| grep宏不产生任何结果。但是,
find-L-路径“*/lef/*.lef”
给出结果,并在其中一个结果上运行
grep宏
,返回匹配项。这里出了什么问题?

find
返回文件名列表。您将此列表传送到
grep
,因此您实际要做的是检查

./lef/sc9mcpp84_14lpp_custom_hvt_c16.lef
./lef/sc9mcpp84_14lpp_custom_hvt_c17.lef
./lef/sc9mcpp84_14lpp_custom_hvt_c18.lef
(或
find
返回的任何内容)包含字符串
。它没有,所以你不会得到结果

grep MACRO./lef/sc9mcpp84_14lpp_custom_hvt_c16.lef
,另一方面,检查是否在文件中找到
MACRO
。使
grep
查看文件内容而不是文件名,您可以使用
xargs

find -L . -path "*/lef/*.lef" | xargs grep MACRO
或者,您可以告诉
find
,您想对其结果做些什么:

find -L . -path "*/lef/*.lef" -exec grep MACRO {} \+
如果要使用
xargs
并确保正确处理奇怪的文件名(包含空格),可以使用
-print0

find -L . -path "*/lef/*.lef" -print0 | xargs -0 grep MACRO

它用空字符而不是换行符分隔文件名;
-0
选项告诉
xargs

find
返回文件名列表。您将此列表传送到
grep
,因此您实际要做的是检查

./lef/sc9mcpp84_14lpp_custom_hvt_c16.lef
./lef/sc9mcpp84_14lpp_custom_hvt_c17.lef
./lef/sc9mcpp84_14lpp_custom_hvt_c18.lef
(或
find
返回的任何内容)包含字符串
。它没有,所以你不会得到结果

grep MACRO./lef/sc9mcpp84_14lpp_custom_hvt_c16.lef
,另一方面,检查是否在文件中找到
MACRO
。使
grep
查看文件内容而不是文件名,您可以使用
xargs

find -L . -path "*/lef/*.lef" | xargs grep MACRO
或者,您可以告诉
find
,您想对其结果做些什么:

find -L . -path "*/lef/*.lef" -exec grep MACRO {} \+
如果要使用
xargs
并确保正确处理奇怪的文件名(包含空格),可以使用
-print0

find -L . -path "*/lef/*.lef" -print0 | xargs -0 grep MACRO

它用空字符而不是换行符分隔文件名;
-0
选项告诉
xargs

您可以发布用于第二种方法的命令吗?当然可以<代码>查找-L-路径“*/lef/*.lef”匹配当前目录中的3个文件:
/lef/sc9mcpp84\u 14lpp\u custom\u hvt\u c16.lef
和类似名称
grep宏。/lef/sc9mcpp84_14lpp_custom_hvt_c16。lef
生成许多结果。
find
提供文件名,但grep命令查看文件内容。我想你想要
find-exec grep
。你能发布第二种方法使用的命令吗?当然<代码>查找-L-路径“*/lef/*.lef”匹配当前目录中的3个文件:
/lef/sc9mcpp84\u 14lpp\u custom\u hvt\u c16.lef
和类似名称
grep宏。/lef/sc9mcpp84_14lpp_custom_hvt_c16。lef
生成许多结果。
find
提供文件名,但grep命令查看文件内容。你想要
查找-exec grep
,我想。谢谢你,但我还是不知道如何将它传送到grep。看起来
grep
无法将文件列表作为参数处理,这正是
find
所要做的。我想这是有道理的,因此它会将这些数据视为
stdin
。这很令人困惑,因为我在grep手册页中没有看到任何关于这一点的提及,但出于某种原因,使用*.lef会起作用。如果将文件名传输到grep(尝试将模式与文件名匹配),或者如果grep将文件名作为参数(尝试将模式与文件内容匹配),则grep的行为会有所不同
xargs
将管道文件名转换为参数,这就是它工作的原因。谢谢,但我仍然对将其管道化到grep感到困惑。看起来
grep
无法将文件列表作为参数处理,这正是
find
所要做的。我想这是有道理的,因此它会将这些数据视为
stdin
。这很令人困惑,因为我在grep手册页中没有看到任何关于这一点的提及,但出于某种原因,使用*.lef会起作用。如果将文件名传输到grep(尝试将模式与文件名匹配),或者如果grep将文件名作为参数(尝试将模式与文件内容匹配),则grep的行为会有所不同
xargs
将管道文件名转换为参数,这就是它工作的原因。