【问题标题】:grep not returning path when finding only 1 occurence仅找到 1 次出现时 grep 不返回路径
【发布时间】:2013-12-09 13:21:04
【问题描述】:

对于某些包含特定模式的 ddl 文件,我需要完整的路径和文件名。我正在使用命令:find /opt/releases/packages/cr666/sas/dbms -name *.ddl | xargs egrep -i -w "重命名|修改|^DROP TABLE"

如果找到超过 1 个文件,它会返回我需要的内容:

/opt/releases/packages/cr666/sas/dbms/sti/FA_BASKET.ddl:RENAME COLUMN;
/opt/releases/packages/cr666/sas/dbms/sti/FA_DISCLOSURE.ddl:MODIFY QUANTITY NUMBER;

但是,如果只找到 1 个文件,则只返回找到的行:

find /opt/releases/packages/cr_c_cr6/sas/dbms -name \*.ddl | xargs egrep -i -w "RENAME|MODIFY|^DROP TABLE"
alter table FA_DISCLOSURE MODIFY (ULINSTRUMENTID VARCHAR2(30 CHAR));

我知道如果我使用选项“-l”我会得到我需要的结果,但没有找到的行。有没有办法为第二个命令获得与第一个示例相同的输出?

【问题讨论】:

  • 非常感谢。 -H 选项成功了。关于与 exec 的挤压,对不起,但我不喜欢它。压缩代码使其更难阅读和维护。
  • 很高兴阅读。由于您是新来的,如果您的问题已经解决,请不要忘记将答案标记为已接受。您可以单击答案旁边的复选标记将其从空心切换为绿色。如有任何疑问,请参阅Help Center > Asking

标签: linux unix grep find


【解决方案1】:

添加grep的-H选项;

find ... | xargs egrep -iHw "RENAME|MODIFY|^DROP TABLE"
                         ^

来自man grep

-H, --with-filename

打印每个匹配的文件名。这是默认的,当有 搜索多个文件。


另外,请注意find .. | xargs egrep 可以通过在 find 中使用-exec 来压缩,如下所示:

find $path -name *.ddl -exec egrep -iHw "RENAME|MODIFY|^DROP TABLE" {} \;

【讨论】:

    【解决方案2】:

    如果您的 grep 不接受“-H”选项,也只需在“/dev/null”中搜索 - 不会花很长时间,而且它永远不会在其中找到任何东西 ;-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-08
      • 1970-01-01
      • 2019-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 2019-03-05
      相关资源
      最近更新 更多