在文件中查找“mystring”并仅返回 Linux 上匹配行的特定部分

在文件中查找“mystring”并仅返回 Linux 上匹配行的特定部分

还有一个标题相同但针对 Windows 的问题(尚未回答)。我想知道如何在 Linux 中执行此操作。

我有这个:find ./ -type f -exec grep -H 'mystring' {} \;,它将找到字符串并返回整行...但我想在仅包含一个长行的文件上使用它,所以我希望能够仅接收找到的字符串之前和之后的上下文。

答案1

使用grep -o将显示匹配的部分而不是整行。如果一行中有两个或多个匹配项,则它们将打印在单独的输出行上。

要查看mystring相邻字符,您需要扩展模式,以便它也匹配相邻字符。以下命令将搜索(并打印)mystring左侧最多 10 个字符和右侧最多 10 个字符:

grep -oE '.{0,10}mystring.{0,10}'

(如果没有-E你就需要.\{0,10\}mystring.\{0,10\}它,它看起来就不那么好看)。

注意事项和怪癖:

  • -o不可移植,您的电脑grep可能支持也可能不支持。GNUgrep支持-o

  • 不要尝试匹配恰好 10 个字符。当mystring出现在行首或行尾附近时,允许更少的字符至关重要。注意.{0,10}是贪婪的,因此您将尽可能接近 10 个。

  • mystring 2345 mystring …命令中,将查找模式的一个出现,而不是两个。您将看到mystring 2345 myst,然后对下一个出现的搜索将从开始ring,缺少一个匹配项。

  • 同样地,mystring 234567890foo mystring …将打印mystring 234567890,并且搜索下一个出现的位置将从 开始foo。它将找到第二个mystring,但它将打印foo mystring …,而不是567890foo mystring …

  • 如果你grep支持-r(意思是“递归读取每个目录下的所有文件”)那么也许你不需要find。例如:

    grep -rHoE '.{0,10}mystring.{0,10}' ./
    

    find如果你想进行额外的测试的话这将会很有用。

相关内容