2022年1月21日金曜日

aws cliの出力をjqで取り出す

jqとは: JSONの中身を取り出したいときに使う

jq is a lightweight and flexible command-line JSON processor.

jq is like sed for JSON data - you can use it to slice and filter and map and transform structured data with the same ease that sed, awk, grep and friends let you play with text.

jqはこちらを参考

https://stedolan.github.io/jq/tutorial/

aws cliはこちらを参考

https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html


使い方 

JSON出力をパイプしてcommandでクエリ

<JSON 出力のコマンド> | jq 'command'

  • パイプなどでコマンドが 長くなっても1組のクォーテーションの中にいれること。
  • クォーテーションはシングルでもダブルでもいい。ほとんどシングルで書かれている(?)。
  • テストはjsonに保存して cat tmp.json | jq ... などとするのがよさそう。

--

aws ec2 describe-instances の出力を例にする。

JSONの出だしがこうなっているとする。

{
  "Reservations": [
    {
      "Groups": [],
      "Instances": [
        {


全部出力

jq '.'

ドット

ドットで つないで、次のネストへの中のInstancesを選択。さらにStateを選択

jq '.Reservations[0].Instances[].State' 

出力例

{

  "Code": 0,

  "Name": "pending"

}

.Stateをパイプしても同じ結果になる

jq '.Reservations[0].Instances[] | .State' 


リスト

jq '.Reservations[]'  

jq '.Reservations' 

の違いに注意。リストの中か、リスト全部が出るかの違い。

jq '.Reservations[0]' 

とするとリストの1番め。以下インデックスで選べる。インデックスの結果がなければ空白が返る。


Reservations[].Instances[]

とすると、Reservations[0],...[最後] まで全部に対しての.Instances[] になります。


複数の値を出力

パイプして書きます。 "\(.ValueA) \(.ValueB)" 

2つの値の間はコンマなどを入れてもよい


例: EC2インスタンスをdescribeして、InstanceId、tagを出力

aws ec2 describe-instances | jq '.Reservations[].Instances[] | "\(.InstanceId) \(.Tags)"' 


例: Lambda全部のFunctionName 

(.Functions[] がリスト全部になっていることに注意)

aws lambda list-functions | jq '.Functions[].FunctionName'


例: LambdaでFuncnctionNameとRuntimeを出力

aws lambda list-functions | jq '.Functions[] | "\(.FunctionName) \(.Runtime)" '

select で条件付け

例: EC2インスタンスをdescribeして、runningのものだけを出力


jq '.Reservations[0].Instances[] | select (.State.Name == "running" )' 

例: cfn でStack名を全て出力

aws cloudformation describe-stacks | jq '.Stacks[].StackName'

例: cfn でCREATE_COMPLETEになっているStackを出力


aws cloudformation describe-stacks | jq '.Stacks[] | select (.StackStatus == "CREATE_COMPLETE" ) | .StackName '

describe-instancesのオプション


aws ec2 describe-instances \
    --query 'Reservations[*].Instances[*].{Instance:InstanceId,Subnet:SubnetId}' \
    --output json


aws ec2 describe-instances | jq '.Reservations[].Instances[] | {Instance: .InstanceId, Subnet: .SubnetId}'

は同じ結果になる。(出力のかっこが少し違うけど)

JSONを一行JSON lineにする

上記の後ろに

| jq -c '.'

をつけると、出力が一行になる。-c はcompactでJSONのPrettyの逆操作。'.' の部分は場合によって .[] だったりするかもしれない。


jqの出力を一行にする


| tr '\n' ','

で改行を,に変える


Cfnのスタック名を全て出力

aws cloudformation describe-stacks | jq '.Stacks[].StackName'

0 件のコメント:

コメントを投稿