El patrón grep regex coincide en cada línea donde solo todas las coincidencias aparecen y se imprimen en la misma línea

El patrón grep regex coincide en cada línea donde solo todas las coincidencias aparecen y se imprimen en la misma línea

intentando extraer algunos patrones por línea, de un archivo de registro. Estoy intentando extraer la primera marca de tiempo y otras dos o tres coincidencias, pero quiero poder imprimir solo las coincidencias de las líneas donde aparecen todas las coincidencias. ¿Existe un único comando grep con el que pueda hacer esto o tengo que recorrer cada línea?

Mi línea de registro es así

2018-08-07 08:55:20 ERROR[t-dispatcher-24] - Error while processing message: code:[RequestTimeout], message:[{"from_addr_type": null, "transport_name": "999_abc_999_2_1", "in_reply_to": null, "group": null, "timestamp": "2018-08-07 07:55:19.795748", "from_addr": "341231231234", "message_type": "user_message", "helper_metadata": {}, "to_addr": "ABCD", "to_addr_type": null, "session_id": "157692", "content": "0013091779", "routing_metadata": {}, "message_version": "20110921", "transport_type": "XXXX", "provider": "abc_somewhere", "transport_metadata": {"abc_somewhere_XXXX": {"clientId": "XXXX157692", "starCode": "999", "session_id": "157692", "phase": "2", "dcs": "15", "requestId": "157692"}}, "session_event": "resume", "message_id": "5d9cab5353ff449783a737e8390a690b"}]

Quiero poder extraer ciertos grupos como la marca de tiempo al inicio, las secciones "contenido" y "to_addr".

Se me ocurrió esto: grep -oP '(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})|"to_addr":"\K(\d+)|"content":\K"(.+?)"' | tr -d '\n'

Pero no puedo seleccionar sólo las líneas donde existen las tres coincidencias de patrones. Por favor que estoy haciendo mal? ¿Estoy esperando demasiado?

Respuesta1

Estás usando un O |entre tus patrones, quieres un Y.

En su patrón, está buscando, "to_addr":"\K(\d+)pero en su ejemplo, el valor de to_addres, ABCDpor lo que no coincide con \d+y hay un espacio entre "to_addr:y "ABCD", lo mismo para content.

Si to_addrsiempre es antes content:

grep -P '^\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}.*?"to_addr": "\d+.*?"content": ".+?"' 

De lo contrario, utilice búsquedas anticipadas:

grep -P '^\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}(?=.*?"to_addr": "\d+)(?=.*?"content": "(.+?)")' 

Si desea imprimir sólo las coincidencias, le sugiero una frase de 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

información relacionada