2017-04-10 69 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