【问题标题】:Find in Linux combined with a search to return a particular line在 Linux 中查找与搜索相结合以返回特定行
【发布时间】:2011-10-21 06:24:22
【问题描述】:

我正在尝试从通过该搜索找到的文件中返回特定行:

find . -name "database.php"

这些文件中的每一个都包含一个数据库名称,旁边是一个 php 变量,例如 $dname=

我一直在尝试使用 -exec 对该文件执行 grep 搜索,但没有成功

 -exec "grep {\}\ dbname"

谁能告诉我如何完成这项任务?

我正在运行 CentOS 5,并且在我的服务器的子目录中存储了大约 100 个 database.php 文件。

谢谢

杰森

【问题讨论】:

    标签: linux sed awk find


    【解决方案1】:

    您将 grep 的参数倒置,并且需要将它们作为单独的参数:

    find . -name "database.php" -exec grep '$dbname' /dev/null {} +
    

    /dev/null 的存在可确保列出匹配的文件名以及匹配的行。

    【讨论】:

    • 哇,jonathan leffler...你就像名人一样,代表前 10 名 SO 用户。你是怎么得到这么多声望的?
    • 仅在历史榜单上排名第 35 位(仅在第一页上)。你需要在很长一段时间内回答很多问题才能到达那里。
    • 哦,原来如此:)
    【解决方案2】:

    我认为这可以做到。不确定您是否需要针对 CentOS 进行任何调整。

    find . -name "database.php" -exec grep dbname {} \;
    

    【讨论】:

    • 或者使用+代替;,这样多个文件就可以用一个grep来处理。
    【解决方案3】:

    我使用 xargs 解决了这个问题

    find . -name "database.php" -print | xargs grep \'database\'\=\> > list_of_databases
    

    如果您找到更好的方法,请随时发布(或一些代表以获得好的答案)

    【讨论】:

      【解决方案4】:

      我倾向于习惯性地避免 find,因为我从来没有学会如何正确使用它,所以我完成任务的方式是:

      grep dbname **/database.php
      

      编辑:此命令并非在所有情况下都可行,因为它可能会生成一个很长的参数列表,而 find 会像 xargs 一样对找到的文件一个接一个地执行它的命令。而且,正如我在评论中指出的那样,它可能不是很便携。但这该死的短;)

      【讨论】:

      • 其实不是grep,是shell对**做文件名扩展,递归匹配当前目录下的所有文件。 zsh 多年来一直支持这种语法,但 bash 只拥有它since version 4,或者一年多一点。显然默认情况下它是关闭的,但在我的发行版(Arch)上它必须设置为打开,因为我在发布之前在我的 bash 中对其进行了测试并且它有效。
      猜你喜欢
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      • 2020-12-06
      • 1970-01-01
      相关资源
      最近更新 更多