【问题标题】:how to find files containing a string using egrep如何使用 egrep 查找包含字符串的文件
【发布时间】:2009-09-01 13:52:25
【问题描述】:

我想在linux下找到包含特定字符串的文件。 我尝试了类似但无法成功:

找到 . -name *.txt | egrep 我的字符串

【问题讨论】:

    标签: linux find grep


    【解决方案1】:

    在这里,您将文件名(find command 的输出)作为输入发送到 egrep;您实际上想对文件的内容运行 egrep。

    这里有几个选择:

    find . -name "*.txt" -exec egrep mystring {} \;
    

    甚至更好

    find . -name "*.txt" -print0 | xargs -0 egrep mystring
    

    检查find command help 以检查单个参数的作用。
    第一种方法将为每个文件生成一个新进程,而第二种方法将多个文件作为参数传递给 egrep;需要 -print0 和 -0 标志来处理可能令人讨厌的文件名(例如,即使文件名包含空格,也可以正确分隔文件名)。

    【讨论】:

    • 您在第一个命令的末尾缺少\+\;
    • 这不是试图在 mystring 中查找文件名吗?我认为他正在寻找另一种方式。
    • @spatz:关于 \+ 的便利功能是 + 对大多数 shell 来说不是特殊字符(我不知道任何 shell 有什么特殊之处,但我不愿全部说明),所以你不需要反斜杠。
    【解决方案2】:

    尝试:

    find . -name '*.txt' | xargs egrep mystring
    

    你的版本有两个问题:

    首先*.txt 将首先由 shell 扩展,为您提供当前目录中以 .txt 结尾的文件列表,例如,如果您有以下内容:

    [dsm@localhost:~]$ ls *.txt
    test.txt
    [dsm@localhost:~]$ 
    

    您的find 命令将变为find . -name test.txt。请尝试以下说明:

    [dsm@localhost:~]$ echo find . -name *.txt
    find . -name test.txt
    [dsm@localhost:~]$ 
    

    其次egrep 不采用来自STDIN 的文件名。要将它们转换为参数,您需要使用 xargs

    【讨论】:

    • 我还建议将 -name 后面的模式用引号括起来,以防止 shell 对其进行模式匹配
    • 感谢大家提供如此全面的答案。
    【解决方案3】:
    find . -name *.txt | egrep mystring
    

    这不起作用,因为egrep 将在find . -name *.txt 生成的输出中搜索mystring,这只是*.txt 文件的路径。

    相反,您可以使用xargs

    find . -name *.txt | xargs egrep mystring
    

    【讨论】:

      【解决方案4】:

      你可以使用

      find . -iname *.txt -exec egrep mystring \{\} \;
      

      【讨论】:

        【解决方案5】:

        这是一个示例,它将返回所有 *.log 文件的文件路径,这些文件的行以 ERROR 开头:

        find . -name "*.log" -exec egrep -l '^ERROR' {} \;
        

        【讨论】:

          【解决方案6】:

          您可以使用 egrep 的递归选项

          egrep -R "pattern" *.log
          

          【讨论】:

          • 这不起作用。 -R 选项仅在参数列表中提供目录时才会递归到目录中。在这种情况下,这些目录中的所有文件都将被读取,而不仅仅是以 .log 结尾的文件。如果您使用此方法成功,那是因为当前目录中有以 .log 结尾的文件,因为 shell 会解析 *.log。
          • 也许egrep -R "pattern" --include=*.log .?
          【解决方案7】:

          如果你只想要文件名:

          find . -type f -name '*.txt' -exec egrep -l pattern {} \;
          

          如果您想要文件名和匹配项:

          find . -type f -name '*.txt' -exec egrep pattern {} /dev/null \;
          

          【讨论】:

            猜你喜欢
            • 2019-06-04
            • 1970-01-01
            • 1970-01-01
            • 2019-10-13
            • 1970-01-01
            • 1970-01-01
            • 2017-02-12
            • 2016-05-06
            • 1970-01-01
            相关资源
            最近更新 更多