2017-04-10 63 views
0

我正在运行OSX。我可以使用什么命令行工具?我有一个带有这个JSON输出的大文本文件。我正在寻找一种方法去除那些没有last_login_dateemail,我对那些没有一个的记录不感兴趣。这里的输出:如何使用sed或awk去掉一组行或块?

{ 
     "_id" : ObjectId("52fba903e4b0aa6226e0ce26"), 
     "email" : "[email protected]" 
} 
{ 
     "_id" : ObjectId("521ca254e4b0d28eb6a07f26"), 
     "email" : "[email protected]", 
     "last_login_date" : ISODate("2017-04-10T14:27:03.212Z") 
} 

是sed或awk的候选人吗?如果是这样,你能告诉我怎么从文件中剥离出来:

{ 
     "_id" : ObjectId("52fba903e4b0aa6226e0ce26"), 
     "email" : "[email protected]" 
} 
+0

['jq'](https://stedolan.github.io/jq/)是解析JSON的绝佳CLI,但请注意,您的示例输入是_not_有效的JSON。 – mklement0

+0

不幸的是,这是文件输出,我不得不与...一起工作,看看是否有办法清除这个。谢谢。 – noober

+0

[解析与Unix工具的JSON]可能的重复(http://stackoverflow.com/questions/1955505/parsing-json-with-unix-tools) – tripleee

回答

1

如果输入正确的JSON,使用第三方CLI jq将是正确的工具 - 见底部。
鉴于它不是,必须使用常规文本处理实用程序。

neric's answer与macOS附带的BSD grep一起使用,但依赖于非常特定的文件布局。

awk允许更灵活的解决方案(仍假定在输入的JSON对象不是嵌套,但是):

awk -v RS='{' '/"last_login_date"/ { print RS $0 }' file 
  • -v RS='{'RS,所述输入记录分隔符到{,这意味着一次只读取一个类似JSON的对象(不带前导{)。

  • 正则表达式匹配模式/"last_login_date"/在每条记录中查找子串"last_login_date",并且只执行相关操作({...})(如果找到)。

  • print "{" $0 }只需重新添加前导{即可打印匹配记录。


如果输入是正确的JSON,使用jq会使处理既更健壮和简洁

jq 'select(.last_login_date)' file 

上面简单地选择(在过滤器)只有输入文件中具有last_login_date属性的那些JSON对象(其值不是布尔值false )。

1

如果这些记录,你究竟是如何描述他们,那么你可以使用:

grep last_login_date -B 3 -A 1 yourFile.json > out.json 

基本上grepping为你对什么感兴趣并保持3行之前的模式和1行后。

+0

适合我。谢谢! – noober