【问题标题】:Using grep to search for a word in a very long string使用 grep 在很长的字符串中搜索单词
【发布时间】:2015-08-26 21:47:46
【问题描述】:

我有一个包含唯一长字符串的大文件。我需要在该文件中搜索特定单词。当然,我不能使用gedit 或类似的软件,因为它们会阻塞。所以,一个解决方案可能是grep。问题是如果单词匹配,它会将完整的字符串返回到 shell,所以我找不到单词所在的位置,也无法观察到其他附近的单词。

是否有任何特定选项可以传递以在 grep shell 流找到我的单词后立即停止/暂停(例如,匹配后的一定数量的字符)?

【问题讨论】:

    标签: linux bash text grep bigdata


    【解决方案1】:

    使用-o 选项“仅显示匹配行中与 PATTERN 匹配的部分。”

    例子:

    % cat lorem
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.                                                                                                                                              
    % grep -oE '.{20}fugiat.{20}' lorem
    se cillum dolore eu fugiat nulla pariatur. Exc
    

    编辑:@tripleee 建议使用 E 部分,以便在匹配的任一侧提供填充。

    【讨论】:

    • 我还需要查看与我的匹配项相近的词,例如,...esse cillum dolore eu fugiat nulla pariatur...
    • 然后尝试grep -oE '.{40}word.{40}' file 以获取匹配两边的 40 个字符的上下文。 GNU grep 也有 --color 来突出匹配。
    • 请注意-E 更改为不同的正则表达式语法。这里的牛肉是.{40},在传统的grep中是........................................;但是现代的grep 支持相同的结构,只是你需要丑陋的反斜杠; .\{40\}
    【解决方案2】:

    使用-m NUM, --max-count=NUM 选项:

    $ grep -m 1 [pattern] [/path/to/file]
    

    在 NUM 个匹配行之后停止读取文件。如果输入是来自常规文件的标准输入,并且输出了 NUM 个匹配行,则 grep 确保在退出之前将标准输入定位到最后一个匹配行之后,而不管是否存在尾随上下文行。这使调用进程能够恢复搜索。当 grep 在 NUM 个匹配行之后停止时,它会输出任何尾随上下文行。当同时使用 -c 或 --count 选项时,grep 不会输出大于 NUM 的计数。当同时使用 -v 或 --invert-match 选项时,grep 会在输出 NUM 个不匹配的行后停止。

    【讨论】:

    • 当有匹配时,这仍然显示我的完整行。
    • 我的错,我误读了这个问题!我以为你更关心在第一场比赛后停止而不是在比赛后立即停止。
    猜你喜欢
    • 2011-12-27
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    相关资源
    最近更新 更多