If/else innerhalb einer grep-Anweisung

If/else innerhalb einer grep-Anweisung

Ich versuche, alle Vorkommen von zu finden "type":"FollowEvent"und dann innerhalb dieser Vorkommen, sofern auf die Zeichenfolge "actor":kein folgt {, die in eingeschlossene Zeichenfolge zu erfassen, "die unmittelbar auf folgt "actor":. Andernfalls erfassen Sie die in eingeschlossene Zeichenfolge, "die unmittelbar auf kommt "login:".

Was ich bisher habe:

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

BEARBEITEN: Was dies bewirkt zgrep:

Suchen Sie für alle Dateien in /Pfad/zum/Verzeichnis und für alle Zeilen, die enthalten "type":"FollowEvent", nach "actor:"nicht gefolgt von {. Nehmen Sie dann alles nach dem :und vor dem nächsten ,. Tragen Sie die Ergebnisse in ein results_file.txt.

BEARBEITEN DER ANGEZEIGTEN DATEN:

Eine einzelne Zeile in den zu grependen Dateien könnte folgendermaßen aussehen:

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

oder so:

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

Antwort1

loginDer unten aufgeführte Benutzername targetkann aus beiden JSON-Dokumenten mithilfe von: abgerufen werden jq.

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

Ebenso ist das loginFolgende actorerhältlich:

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

Wenn Sie die Ausgabe von abhängig machen möchten type(und nichts ausgeben möchten, wenn dies typenicht der Fall ist FollowEvent):

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

verwandte Informationen