Bash 如何通过管道在grep之后使用if语句

Bash 如何通过管道在grep之后使用if语句,bash,Bash,我试图找到“type”:“FollowEvent”,然后在这些实例中,如果字符串“actor”:后面没有{,则捕获紧跟在“actor:之后的“中包含的字符串。否则,捕获中包含的字符串。”在登录后立即出现: 到目前为止,我所拥有的: zgrep -e '"type":"FollowEvent"' /path/to/dir/* | zgrep -o '"actor":(?!{)*' | cut -f2- -d: | cut -d',' -f1 > results_file.txt 它的作用是

我试图找到
“type”:“FollowEvent”
,然后在这些实例中,如果字符串
“actor”:
后面没有
{
,则捕获紧跟在
“actor:
之后的
中包含的字符串。否则,捕获
中包含的字符串。”
在登录后立即出现:

到目前为止,我所拥有的:

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

对于/path/to/dir中的所有文件,对于包含
的所有行,“键入”:“FollowEvent”
,查找
“actor:
后面没有
{
。然后在
之后和下一个
之前获取所有内容。将结果放入
结果文件.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"}
或者像这样:

{"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\u file.txt
中:

username4
username1
比如说:

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

您可以使用默认的软件包管理器在大多数发行版中安装它

不管怎样,如果你需要用GNU工具来做的话

$ echo "$JSON" | grep '"type":"FollowEvent"' | sed 's/.*"login":"\([^"]*\).*/\1/g'
username4

你应该看看。在大多数发行版上都可以作为一个包使用。我没有。Python和它的json解析器呢?或者PHP和它的json解析器呢?真的……没有json解析器就不要解析json。这是jq的一个小练习。我无法安装jq,所以我正在寻找另一个解决方案。可能:
echo“$json”| grep“type”:“FollowEvent”“|tr”、“\n”| grep login | cut-d\”-f4
Thank you@ton!受您启发,最后一个有效的命令是:
zgrep-e''type:“FollowEvent”./2011*;sed's/*“login:“\([^”]*\)./\1/g'>results\u file.txt
一个问题,尽管如此:这捕获了“login”之后的所有内容,但“login”不止一个“在每一行上。我想要一个专门与“actor”关联的,而不是“payload”。那怎么办?
echo“$JSON”| grep'”类型“:“FollowEvent”| sed's/*“actor”:。*“login”:“\([^”]*\)./\1/g”