2017-01-24 17 views
2

私は巨大なJSONオブジェクトを持っています。利用可能なフィールドのうち、小さな%に、それをフィルタリングしたいと思います。私はenter link description hereのようないくつかの同様の質問を検索しましたが、それはオブジェクトの配列のためです。だから、効果的にデータを絞り込むJQを使用してJSONからキーをフィルタリングするにはどうすればよいですか?

{ 
"timestamp":1455408955250999808, 
"client": 
    { 
    "ip":"76.72.172.208", 
    } 
"clientRequest": 
    { 
    "bytes":410 
    } 
} 

:私は何をしようとしていることが好きに見える新しいJSONオブジェクトを作成している

{ 
"timestamp":1455408955250999808, 
"client": 
    { 
    "ip":"76.72.172.208", 
    "srcPort":0, 
    "country":"us", 
    "deviceType":"desktop"}, 
"clientRequest": 
    { 
    "bytes":410, 
    "bodyBytes":0} 
    } 

:私はのようになりますJSONオブジェクトを持っています。 | jq 'map({client.ip: .client.ip, timestamp: .timestamp})'をし、私が取得し続ける:私が試した

jq: error (at <stdin>:0): Cannot index number with string "client" 

も、最も簡単な| jq 'map({timestamp: .timestamp})'は同じエラーを示しています。

私はK、Vのペアにアクセスして、上のリンクの質問で彼の配列のために人がしたようにマップ機能を使用すると思った。どんな助けでも大歓迎です。

答えて

1

Huzzah。十分に単純には本当に:)

cat LogSample.txt | jq '. | {Id: .Id, client: {ip: .client.ip}}' 

基本的にオブジェクトを自分で定義:)

+3

初期の '.'は必要ありません。ここでは「Id:.Id」は「Id」に省略することができます。したがって: 'jq '{Id、client:{ip:.client.ip}}'で十分でしょう。 – peak

1

あなたが欲しい物を構築する場合、それは最も単純になりますように見えます。あなたの例に基づいて、次のフィルタ使用して、そうでした:あなたの入力はJSONオブジェクトであるのに対し、対照的に

{ timestamp, 
    client: { ip: .client.ip }, 
    clientRequest: {bytes: .clientRequest.bytes } 
} 

を、mapは、その入力が配列であることを期待しています。

また、jqはキーを削除する直接的な方法も提供しています。 del/1を使用してください。

+0

ありがとう@peak、フォローアップの質問として、私が観察しているjsonにエントリが存在する場合にのみ、オブジェクトを作成する方法を教えてください。つまり、入ってくるjsonには.client.ipの値はなく、存在しない場合は、そのフィールドを作成しません。このメソッドは強制的に作成し、空の.client.ipフィールドを作成します。 – HectorOfTroy407

関連する問題