If/else в операторе grep

If/else в операторе grep

Я пытаюсь найти все экземпляры "type":"FollowEvent", а затем внутри этих экземпляров, если за строкой "actor":не следует {, то захватываем строку, заключенную в ", которая идет сразу после "actor":. В противном случае захватываем строку, заключенную в ", которая идет сразу после "login:".

Что у меня есть на данный момент:

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

EDIT: Что это zgrepделает:

Для всех файлов в /path/to/dir, для всех строк, которые содержат "type":"FollowEvent", найти "actor:"не за которым следует {. Затем взять все после :, и до следующего ,. Поместить результаты в results_file.txt.

ИЗМЕНИТЬ ПОКАЗ ДАННЫХ:

Одна строка в файлах, которые проверяются с помощью grep, может выглядеть следующим образом:

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

или так:

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

решение1

Имя пользователя, указанное loginниже, targetможно получить из обоих документов JSON с помощью jq:

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

Аналогично, можно использовать и loginпод :actor

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

Если вы хотите сделать вывод условным для type(и не выводить ничего, если typeне равно FollowEvent):

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

Связанный контент