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”
?