【问题标题】:Using Grep and Regex to generate a text file which lists all files that have specific strings in them使用 Grep 和 Regex 生成一个文本文件,其中列出了所有包含特定字符串的文件
【发布时间】:2018-05-01 17:05:24
【问题描述】:

我无法为 Grep 和 Regex 找出一个非常具体的用例。我搜索了很多,似乎无法找到答案。

我想从包含数百个不同程序的目录的根目录中递归运行 Grep。我希望输出打印到文本文件并列出与某些正则表达式匹配的所有文件的文件名。具体来说,这是我需要用英语做的:

查找包含文本 [stringA] AND ["stringB"] OR ['stringB'] 的所有文件,并将每个文件的文件路径打印到添加了一些上下文的输出文本文件。对于两个 stringB 片段,引号很重要,我只想找到带有单引号或双引号的 stringB 的文件。换句话说,

包含不带引号的 stringA 和带单引号或双引号的 stringB 的所有文件。

感谢任何帮助,谢谢!

编辑:抱歉问了一个糟糕的问题:)

我已经做了一些研究,并弄清楚了其中的一部分。我已经找到了寻找我正在寻找的字符串的正则表达式。实际的字符串是“ATA”。要在全局范围内查找它,不区分大小写,并且在它周围使用任一类型的引号,字符串两侧有一些空格或没有空格,我们可以使用:

/['"]\s*ATA\s*['"]/gi

我还需要找到的第一个字符串是一个函数调用:call wflnkmod( 其正则表达式是:

/call\swflnkmod\(/gi

现在我只需要弄清楚如何搜索文件并确保其中包含每个文件的实例,然后找出用于递归搜索所有文件并将它们打印到输出文件的 grep 命令!

【问题讨论】:

标签: regex linux bash grep


【解决方案1】:

对于AND搜索最好链接greps,OR可以处理。

假设我们正在寻找单词cat"ata"'ata'。如果您只对文件名感兴趣,而不是实际匹配...

grep -wilm1 cat file* | xargs  grep -wilEm1 "'ata'|\"ata\""

file1
file2

搜索完整的单词匹配-w(不是子字符串),在第一次匹配-m1 后退出并忽略大小写(-i)。 OR 需要 -E 标志。 -l 仅打印文件名。

这里是用于测试的文件。

==> file1 <==
cat
fat hat "ata"

==> file2 <==
cat fat hat 'ata'

==> file3 <==
cat fat hat ata

==> file4 <==
category fat hat ata

【讨论】:

    【解决方案2】:

    解决方案

    应该可以解决问题(&lt;dir&gt; 需要替换为要搜索的目录):

    grep -r -i -l "stringA" <dir> | xargs grep -i -l -E "'stringB'|\"stringB\""
    

    说明

    上面的行首先搜索stringA。生成的文件列表通过管道传输到xargs,并使用通过标准输入提供的附加参数(文件列表,包含stringA)调用指定的命令(grep -i -l -E "'stringB'|\"stringB\"")。

    grep 选项:

    • -r, --recursive(不言自明)
    • -i, --ignore-case 搜索不区分大小写
    • -l, --files-with-matches 只打印匹配的文件的文件名 给定模式
    • -E 将模式解释为扩展正则表达式

    您尝试过的表达式的两个主要问题是:

    1. [] 使用不当。 [] 让您定义一个字符集,例如[abcd] 匹配指定字符之一。
    2. 表达式中的引号引用或转义不正确。如果您用双引号 (") 引用某些内容,则引号字符串内的双引号需要转义\" 在带引号的字符串中生成"。如果您根本没有引用您的表达式,( 也需要转义。

    【讨论】:

    • 谢谢!我使用了您在上面建议的内容,并对我需要查找的字符串进行了一些修改,这些字符串实际上是“call wflnkmod”和“ATA”——使用任何一种引号类型。我还想在“ATA”字符串的任一侧允许空格,所以我的最终管道 grep 命令是: grep -r -i -l "call wflnkmod(" 2017.1 | xargs grep -i -l -E "'\ sATA\s'|\"\s*ATA\s*\""
    猜你喜欢
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 2017-10-07
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多