grep 可以显示上下文,但不显示完整的行吗?

grep 可以显示上下文,但不显示完整的行吗?

我有一个包含几行很长行的文件。我想用 grep 查找文件中可能出现多次的字符串,甚至可能在一行中出现多次。

$ cat 2014-11-03.json | grep 218

这会产生不可读的输出。输出太多了。

$ cat 2014-11-03.json | grep -o 218

这削减了太多内容。它只显示匹配的模式,没有任何上下文。

基本上我想要的输出

... <category_id>218</category_id> ...

(是的,这是 XML,但我不想解析 XML。我只想输出匹配的字符串及其两边的几个字符。只是几个字符,而不是整行。)

Grep 似乎有选项可以显示仅有的匹配的字符串,或者在其整行上下文中匹配的字符串(默认行为),或者在前后几行上下文中匹配的字符串,但我找不到在前后几个字符的上下文中显示匹配的字符串的选项。

$ cat 2014-11-03.json | tr ' ' '\n' | grep 218 

这并不理想:只要相关文件在大致正确的位置有空格,它就可以工作。这次对我来说有效,但不能保证它会再次有效。

答案1

这个问题很老了,但是因为我在寻找一种方法来 grep 仅部分行时偶然发现了它,所以如下:

一种解决方法是启用“仅匹配”选项,然后使用 RegExp 的功能来 grep 比文本更多的内容:

grep -o ".\{0,50\}WHAT_I_M_SEARCHING.\{0,50\}" ./filepath

当然,如果您使用颜色突出显示,您可以随时再次 grep 以仅为真正的匹配着色:

grep -o ".\{0,50\}WHAT_I_M_SEARCHING.\{0,50\}"  ./filepath | grep "WHAT_I_M_SEARCHING"

笔记:

  • 如果每行有多个匹配项,则可能不会返回所有预期结果: .{0,50} 可能会匹配以下匹配项的一部分,从而阻止匹配。
  • 这个正则表达式很慢。非常慢。(请参阅评论以了解可能的解决方案)

答案2

另一种方法是使用:

grep -o -P '.{0,50}search_string.{0,50}' 2014-11-03.json | grep 'search_string'

这将为您提供前后 50 个字符的search_string突出显示。

答案3

我知道以漂亮格式显示 json 的最佳方法是使用 pjson。格式化后,您可以添加 grep 命令。

$ echo '{"test1":"t1","test2":"t2"}' | pjson
{
   "test1": "t1",
   "test2": "t2"
}

使用以下命令安装pip

pip install pjson

然后,将任何 json 内容通过管道传输到pjson

相关内容