首页 > 解决方案 > 如何通过管道在grep之后使用if语句

问题描述

我试图找到 的所有实例"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",find"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"}

我想要的是:

仅包含演员用户名的文件。在这里,我想要,在results_file.txt

username4
username1

标签: bash

解决方案


比方说:

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

对于一个简单的答案,我建议您使用jqhttps ://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

推荐阅读