bash - 如何通过管道在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
解决方案
比方说:
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
推荐阅读
- python - 将数据框中的值与数据框中的所有其他值进行比较
- asp.net-core - 与本地提供商的 OAuth 身份验证
- jquery - jquery UI datepicker:从今天开始计算 minDate x 年
- timestamp - PyTables 检索最大值和最小值?
- python-3.x - Tkinter 碰撞和拖动
- reactjs - 用 jest 进行反应测试不尊重 webpack 别名中的 moduleNameMapper
- postgresql - 无法运行 Postgres 存储过程
- performance-testing - 将 3 个测试计划重新组合为 1 个测试
- reactjs - Material-ui-pickers - 如何设置选项?我需要允许awareOfUnicodeTokens
- javascript - 窗口单击事件 Javascript 在第一次单击时不起作用