【问题标题】:Pipe find results into grep producing no results管道查找结果到 grep 中不产生任何结果
【发布时间】:2016-01-14 15:28:06
【问题描述】:

这里是一个简单的问题。 find -L . -path "*/lef/*.lef" | grep MACRO 不产生任何结果。但是,find -L . -path "*/lef/*.lef" 会给出结果并在其中一个结果上运行grep MACRO 会返回匹配项。这里出了什么问题?

【问题讨论】:

  • 你能发布你用于第二种方法的命令吗?
  • 当然。 find -L . -path "*/lef/*.lef" 匹配当前目录中的 3 个文件:./lef/sc9mcpp84_14lpp_custom_hvt_c16.lef 和类似名称。 grep MACRO ./lef/sc9mcpp84_14lpp_custom_hvt_c16.lef 产生许多结果。
  • find 为您提供文件名,但您的 grep 命令查看文件内容。我想你想要find -exec grep

标签: grep find pipe


【解决方案1】:

find 返回文件名列表。你把这个列表传递给grep,所以你实际上要做的是检查是否

./lef/sc9mcpp84_14lpp_custom_hvt_c16.lef
./lef/sc9mcpp84_14lpp_custom_hvt_c17.lef
./lef/sc9mcpp84_14lpp_custom_hvt_c18.lef

(或任何find 返回的)包含字符串MACRO。它没有,所以你不会得到结果。

另一方面,

grep MACRO ./lef/sc9mcpp84_14lpp_custom_hvt_c16.lef 检查是否在文件 找到MACRO。 make 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

【讨论】:

  • 谢谢,但我仍然对通过管道将其传递给 grep 感到困惑。看起来grep 无法将文件列表作为参数处理,这就是find 的管道。我想这是有道理的,因此它会将这些数据视为stdin。这很令人困惑,因为我在 grep 手册页中没有看到任何关于此的提及,但出于某种原因,使用 *.lef 会起作用。
  • grep 的行为不同,如果文件名 管道 到它(尝试将模式与文件 name 匹配)或如果它获取一个文件作为 argument 的名称(尝试将模式与文件 content 匹配)。 xargs 将管道文件名转换为参数,这就是它起作用的原因。
猜你喜欢
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 2013-01-09
相关资源
最近更新 更多