Si/si no dentro de una declaración grep

Si/si no dentro de una declaración grep

Estoy tratando de encontrar todas las instancias de "type":"FollowEvent"y luego, dentro de esas instancias, si la cadena "actor":no va seguida de {, capturo la cadena encerrada "que viene inmediatamente después "actor":. De lo contrario, capture la cadena incluida "que viene inmediatamente después "login:".

Lo que tengo hasta ahora:

zgrep -e '"type":"FollowEvent"' /path/to/dir/* | zgrep -o '"actor":(?!{)*' | cut -f2- -d: | cut -d',' -f1 > results_file.txt

EDITAR: Qué zgrephace esto:

Para todos los archivos en /ruta/al/dir, para todas las líneas que contienen "type":"FollowEvent", busque "actor:"no seguido de {. Luego toma todo después del :y antes del siguiente ,. Pon los resultados en results_file.txt.

EDITAR DATOS QUE MUESTRA:

Una sola línea en los archivos que se están grep podría tener este aspecto:

{"repo":{"url":"https://url","name":"/"},"type":"FollowEvent","public":true,"created_at":"2011-05-29","payload":{"target":{"gravatar_id":"73","id":64,"repos":35,"followers":58,"login":"username3"}},"actor":{"gravatar_id":"06","id":439,"url":"https://url","avatar_url":"https://.png","login":"username4"},"id":"14"}

o así:

{"repo":{"url":"https://url/","name":"/"},"type":"FollowEvent","public":true,"created_at":"2011-04-01","payload":{"target":{"gravatar_id":"40","repos":2,"followers":1,"login":"username2"},"actor":"username1","actor_gravatar":"de4"},"actor":{"gravatar_id":"de4","id":716,"url":"https://url","avatar_url":"https://.png","login":"username2"},"id":"12"}

Respuesta1

El nombre de usuario que figura a logincontinuación targetse puede obtener de ambos documentos JSON usando jq:

$ jq -r '.payload.target.login' file1.json
username3

Asimismo, se puede tener el loginunder :actor

$ jq -r '.actor.login' file1.json
username4

Si desea que la salida sea condicional type(y no producir nada si typeno lo es FollowEvent):

jq -r 'select(.type == "FollowEvent") | .actor.login' file1.json

información relacionada