Как использовать оператор if после grep через pipe - PullRequest
0 голосов
/ 07 июня 2019

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

То, что у меня есть до сих пор:

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

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

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

Одна строка в файлах, которые были grep'd, может выглядеть так:

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

Что я хочу:

файл, содержащий только имена пользователей актеров.Вот, я хочу, в results_file.txt:

username4
username1

1 Ответ

1 голос
/ 07 июня 2019

Допустим,

JSON='{"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"}'

Для простого ответа я предлагаю вам использовать jq: https://stedolan.github.io/jq/

$ echo "$JSON" | jq -r '. | select(.type=="FollowEvent") | .actor.login'
username4

Вы можете установить его в большинстве дистрибутивовс менеджером пакетов по умолчанию.

В любом случае, если вам нужно сделать это с помощью инструментов GNU.

$ echo "$JSON" | grep '"type":"FollowEvent"' | sed 's/.*"login":"\([^"]*\).*/\1/g'
username4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...