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 zgrep
faz:
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 login
abaixo target
pode ser obtido em ambos os documentos JSON usando jq
:
$ jq -r '.payload.target.login' file1.json
username3
Da mesma forma, o login
abaixo actor
pode ser obtido:
$ jq -r '.actor.login' file1.json
username4
Se você quiser condicionar a saída a type
(e não produzir nada se type
não for FollowEvent
):
jq -r 'select(.type == "FollowEvent") | .actor.login' file1.json