Вы используете ИЛИ |
между вашими шаблонами, вы хотите И.
В вашем паттерне вы ищете, "to_addr":"\K(\d+)
но в вашем примере значение to_addr
равно ABCD
так, что оно не совпадает с, \d+
и между "to_addr:
и "ABCD"
, то же самое, есть пробел content
.
Если to_addr
всегда раньше content
:
grep -P '^\d-\d-\d\s\d:\d:\d.*?"to_addr": "\d+.*?"content": ".+?"'
Остальное использовать Lookaheads:
grep -P '^\d-\d-\d\s\d:\d:\d(?=.*?"to_addr": "\d+)(?=.*?"content": "(.+?)")'
Если вы хотите печатать только совпадения, я предлагаю Perl с одним вкладышем:
perl -ane 'print "$1\t$2\t$3\n" if (/^(\d-\d-\d\s\d:\d:\d)(?=.*?"to_addr": "(\d+))(?=.*?"content": "(.+?)")/)' file