Я пытаюсь найти все экземпляры "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