还有一个标题相同但针对 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
如果你想进行额外的测试的话这将会很有用。