Você está usando um OU |
entre seus padrões, você quer um AND.
Em seu padrão, você está pesquisando "to_addr":"\K(\d+)
, mas, por exemplo, o valor de to_addr
é ABCD
, portanto, não corresponde a \d+
e há um espaço entre "to_addr:
e "ABCD"
, mesmo para content
.
Se to_addr
for sempre antes de content
:
grep -P '^\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}.*?"to_addr": "\d+.*?"content": ".+?"'
Ou então, use lookaheads:
grep -P '^\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}(?=.*?"to_addr": "\d+)(?=.*?"content": "(.+?)")'
Se você quiser imprimir apenas as correspondências, sugiro uma linha de uma linha Perl:
perl -ane 'print "$1\t$2\t$3\n" if (/^(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})(?=.*?"to_addr": "(\d+))(?=.*?"content": "(.+?)")/)' file