If/else dentro de uma instrução grep

If/else dentro de uma instrução grep

Estou tentando encontrar todas as instâncias de "type":"FollowEvent"e, dentro dessas instâncias, se a string "actor":não for seguida por {, capture a string incluída "que vem imediatamente depois "actor":. Caso contrário, capture a string incluída "imediatamente após "login:".

O que tenho até agora:

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

EDITAR: O que isso zgrepfaz:

Para todos os arquivos em /path/to/dir, para todas as linhas que contêm "type":"FollowEvent", find "actor:"não seguido por {. Então pegue tudo depois do :e antes do próximo ,. Coloque os resultados em results_file.txt.

EDITAR MOSTRAR DADOS:

Uma única linha nos arquivos que estão sendo submetidos ao grep poderia ter esta aparência:

{"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"}

ou assim:

{"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"}

Responder1

O nome de usuário listado loginabaixo targetpode ser obtido em ambos os documentos JSON usando jq:

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

Da mesma forma, o loginabaixo actorpode ser obtido:

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

Se você quiser condicionar a saída a type(e não produzir nada se typenão for FollowEvent):

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

informação relacionada