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

TRi*_*RiG 14 linux grep command-line

我有一个有几行很长的文件。我想 grep 一个可能在文件中出现多次的字符串,包括可能不止一次出现在一行中。

$ cat 2014-11-03.json | grep 218
Run Code Online (Sandbox Code Playgroud)

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

$ cat 2014-11-03.json | grep -o 218
Run Code Online (Sandbox Code Playgroud)

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

基本上,我想要像这样的输出

... <category_id>218</category_id> ...
Run Code Online (Sandbox Code Playgroud)

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

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

$ cat 2014-11-03.json | tr ' ' '\n' | grep 218 
Run Code Online (Sandbox Code Playgroud)

这并不理想:只要有问题的文件在大致正确的位置有空格,它就可以工作。这次它对我有用,但不能保证它会再次出现。

Jeh*_*man 13

这个问题很老了,但由于我在寻找一种只对一行的一部分进行 grep 的方法时偶然发现了它,所以这里是:

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

grep -o ".\{0,50\}WHAT_I_M_SEARCHING.\{0,50\}" ./filepath
Run Code Online (Sandbox Code Playgroud)

当然,如果你使用颜色突出显示,你总是可以再次 grep 只为真正的匹配着色:

grep -o ".\{0,50\}WHAT_I_M_SEARCHING.\{0,50\}"  ./filepath | grep "WHAT_I_M_SEARCHING"
Run Code Online (Sandbox Code Playgroud)

笔记:

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

  • 加速它的一种选择是在搜索包含 WHAT_I_M_SEARCHING 的行之后运行它以缩小范围。 (3认同)

jhe*_*ran 2

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

$ echo '{"test1":"t1","test2":"t2"}' | pjson
{
   "test1": "t1",
   "test2": "t2"
}
Run Code Online (Sandbox Code Playgroud)

安装它pip

pip install pjson
Run Code Online (Sandbox Code Playgroud)

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