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