【问题标题】:Write a shell script that find-greps and outputs filename and content in 1 line编写一个 shell 脚本,查找 greps 并在 1 行中输出文件名和内容
【发布时间】:2010-11-08 05:29:24
【问题描述】:

要查看所有包含“abc”的 php 文件,我可以使用这个简单的脚本:

find . -name "*php" -exec grep -l abc {} \;

我可以省略 -l 并提取部分内容而不是文件名作为结果:

find . -name "*php" -exec grep abc {} \;

我现在想要的是一个版本,可以同时进行,但在同一行。

预期输出:

path1/filename1: lorem abc ipsum
path2/filename2: ipsum abc lorem
path3/filename3: non abc quod

或多或少有点像grep abc *

编辑:我想把它用作一个简单的 shell 脚本。如果输出在一行上会很棒,因此可以进行进一步的 grepping。但脚本不一定只有一行,反正我是把它放在一个 bash 脚本文件中。

编辑 2: 后来我发现“ack”,这是一个很棒的工具,我现在在大多数情况下都使用它而不是 grep。它可以完成所有这些以及更多。 http://betterthangrep.com/ 你会写ack --php --nogroup abc 来得到想要的结果

【问题讨论】:

    标签: bash shell find grep


    【解决方案1】:
    find /path -type f -name "*.php" | awk '
    {
        while((getline line<$0)>0){
            if(line ~ /time/){
                print $0":"line
                #do some other things here
            }
        }    
    }'
    

    【讨论】:

      【解决方案2】:

      如果你不需要递归搜索,你可以这样做..

      grep -H abc *.php
      

      ..它为您提供所需的输出。 -H 是默认行为(至少在 grep 的 OS X 版本上),所以你可以省略这个:

      grep abc *.php
      

      您可以使用 -R 标志递归 grep,但您无法将其限制为 .php 文件:

      grep -R abc *
      

      同样,这具有相同的期望输出。

      我知道这并不能完全回答您的问题,它只是.. 一种替代方法... 以上只是带有单个标志的 grep,因此比 find/-exec/grep 更容易记住/xargs 组合! (与脚本无关,但对日常 shell'ing 很有用)

      【讨论】:

        【解决方案3】:

        使用-H 开关(man grep):

        find . -name "*php" -exec grep -H abc {} \;
        

        使用xargs 的替代方法(现在不需要-H 开关,至少对于我这里的grep 版本):

        find . -name "*php" -print | xargs grep abc
        

        编辑:由于grep 的行为如orsogufo 所述,如果find 可以想象只返回一个文件名(即如果只有一个 PHP 文件)。如果 orsogufo 的评论 w.r.t. -print0也被并入,命令变为:

        find . -name "*php" -print0 | xargs -0 grep -H abc
        

        编辑 2: 一个(更多1POSIX 兼容版本,由Jonathan Leffler 提出,通过使用/dev/null 避免了-H开关:

        find . -name "*php" -print0 | xargs -0 grep abc /dev/null
        

        1:来自opengroup.org manual on find 的引用暗示-print0 是非标准的:

        SVR4 的查找实用程序的一个功能是 -exec 主要的 + 终止符。这 允许的文件名包含特殊 字符(尤其是 s) 被组合在一起,没有 如果此类文件名出现的问题 通过管道传送到 xargs。其他 实现增加了其他方式 为了解决这个问题,特别是 -print0 使用空字节终止符写入文件名的主文件。 这是 此处考虑过,但未采用。 使用空终止符意味着任何 将要处理的实用程序 find 的 -print0 输出必须添加一个新的 解析空终止符的选项 它现在正在阅读。

        【讨论】:

        • xargs 不需要 -H,因为 grep 在命令行上接收多个文件,在这种情况下,它会输出文件名以及捕获;我认为这是一种标准行为,也应该适用于与您不同的 greps。请注意,最好使用“find ... -print0”并将输出通过管道传输到“xargs -0”,以便使用 0 分隔符,并且您的命令也适用于讨厌的文件名(例如包含空格) .
        • 请注意,处理一个文件被传递给 grep 的可能性的另一种方法是将 /dev/null 添加到命令中,因此 grep 始终至少有两个文件要搜索。 grep 的“-H”选项不是 POSIX 规范的一部分——它是一个有用的 GNU 扩展。
        • 我用 Google 搜索了一下,我知道 -print0 不符合 POSIX 标准...请参阅本页底部附近:opengroup.org/onlinepubs/009695399/utilities/find.html
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-24
        • 1970-01-01
        • 2016-01-19
        • 2017-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多