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é zgrep
hace 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 login
continuación target
se puede obtener de ambos documentos JSON usando jq
:
$ jq -r '.payload.target.login' file1.json
username3
Asimismo, se puede tener el login
under :actor
$ jq -r '.actor.login' file1.json
username4
Si desea que la salida sea condicional type
(y no producir nada si type
no lo es FollowEvent
):
jq -r 'select(.type == "FollowEvent") | .actor.login' file1.json