質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

2回答

6811閲覧

Json形式の出力結果を指定して、1行に出力する方法

teketeke

総合スコア46

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2015/06/08 06:18

AWSのcloudtrailのイベントをCLIで取得しようとすると、結果がJson形式で出力されます。
そのままですと見づらいので「Username」「EventTime」「EventName」のみを出力させるため、以下のようにコマンドを実行しました。

aws cloudtrail lookup-events --output json | jq '.Events[]' | jq '.Username,.EventTime,.EventName'

この場合、「Username」「EventTime」「EventName」が1行にまとまらず、改行が入ってしまいます。
===
"root"
1433738037
"RebootInstances"
===

これを、"root":1433738037:"RebootInstances"のように1行に出力させたいのですが、どのようにコマンドを実行すればよいのでしょうか。

■以下、JSON形式の出力結果(一部値を変更しています)

{
"Events": [
{
"EventId": "452ee0a8-4897-4145-b0f5-123456789",
"Username": "root",
"EventTime": 1433738037.0,
"CloudTrailEvent": "{"eventVersion":"1.02","userIdentity":{"type":"Root","principalId":"123456789","arn":"arn:aws:iam::123456789:root","accountId":"123456789","accessKeyId":"hogehoge","sessionContext":{"attributes":{"mfaAuthenticated":"false","creationDate":"2015-06-08T04:31:59Z"}}},"eventTime":"2015-06-08T04:33:57Z","eventSource":"ec2.amazonaws.com","eventName":"RebootInstances","awsRegion":"ap-northeast-1","sourceIPAddress":"1.2.3.4","userAgent":"console.ec2.amazonaws.com","requestParameters":{"instancesSet":{"items":[{"instanceId":"i-123456"}]}},"responseElements":{"_return":true},"requestID":"5cf67047-3035-4543-ae15-123456789","eventID":"452ee0a8-4897-4145-b0f5-123456789","eventType":"AwsApiCall","recipientAccountId":"123456789"}",
"EventName": "RebootInstances",
"Resources": [
{
"ResourceType": "AWS::EC2::Instance",
"ResourceName": "i-123456"
}
]
},
{
"EventId": "f3094eba-c427-4d28-900e-123456789",
"Username": "root",
"EventTime": 1433737919.0,
"CloudTrailEvent": "{"eventVersion":"1.02","userIdentity":{"type":"Root","principalId":"123456789","arn":"arn:aws:iam::123456789:root","accountId":"123456789"},"eventTime":"2015-06-08T04:31:59Z","eventSource":"signin.amazonaws.com","eventName":"ConsoleLogin","awsRegion":"us-east-1","sourceIPAddress":"1.2.3.4","userAgent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36","requestParameters":null,"responseElements":{"ConsoleLogin":"Success"},"additionalEventData":{"LoginTo":"https://console.aws.amazon.com/console/home?nc2\u003dh_m_mc\u0026state\u003dhashArgs%23\u0026isauthcode\u003dtrue","MobileVersion":"No","MFAUsed":"No"},"eventID":"f3094eba-c427-4d28-900e-123456789","eventType":"AwsApiCall","recipientAccountId":"123456789"}",
"EventName": "ConsoleLogin",
"Resources": []
}
]
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

jq の -c (--compact-output) &リストにすると 1行に出力されますので、後は sed などで整形すればいいと思います。

lang

1jq -M -c '.Events[] | [.Username, .EventTime, .EventName]' | sed -e 's/^\[//' -e 's/\]$//' -e 's/,/:/g'

投稿2015/06/08 08:55

TaichiYanagiya

総合スコア12141

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

teketeke

2015/06/09 00:56

TaichiYanagiya様 回答頂きありがとうございます。 頂きましたコマンドで、こちらの意図した形で出力できました。 jqコマンドのオプションや使い方が分かっていないところがあるので、jqコマンドの使い方を学ぼうと思います。
guest

0

最後に
| tr '\n' ':'
をつけて改行を:に置換してしまえばうまくいきませんか?

lang

1aws cloudtrail lookup-events --output json | jq '.Events[]' | jq '.Username,.EventTime,.EventName' | tr '\n' ':'

投稿2015/06/08 06:24

sharow

総合スコア1149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

teketeke

2015/06/08 08:42

hsarow様 回答頂きありがとうございます。 私の書き方が悪かったのですが、 === "root" 1433738037 "RebootInstances" === 1つのイベント毎に上記が出力されるので、複数イベントあると、以下のようになります。 === "root" 123456789 "RebootInstances" "root" 987654321 "RebootInstances" === その為、trで置き換えると、 "root" :123456789:"RebootInstances" :"root" :987654321 :"RebootInstances" となります。 できれば、以下のように1イベント毎にまとめられないかと思ったのですが、上手くできていません。 "root" :123456789:"RebootInstances" "root" :987654321 :"RebootInstances" ------ sharow様の回答から、以下のようにまわりくどいことをして、「,\n」を「:」に置き換えればできそうになってきました。 ただ、現在以下の「,\n」をsedで置き換えようとすると、置き換えられないので現在も試行錯誤しています。 ※下記の結果をファイルに保存して、「od -c」コマンドで確認すると「,\n」なのですが、sedの条件に「,\n」しても置き換えられないので、何が悪いのか理解できていない状態です。sed -e 's/,\n/:/g' これを追加して実行しても結果は変わりませんでした。 # aws cloudtrail lookup-events --output json | jq '.Events[]' | jq '[.Username,.EventTime,.EventName]' | sed '/\[/d' | sed '/\]/d' | sed -e 's/^ //g' === "root", 123456789, "RebootInstances" "root", 987654321, "RebootInstances" ===
sharow

2015/06/08 09:30

なるほど複数あるのですね、質問をちゃんと読んでいませんでした。 TaichiYanagiyaさんの方法ではうまくいきませんか?
teketeke

2015/06/09 00:58

質問投稿時に質問内容を明確にできておらず失礼いたしました。 今回、TaichiYanagiya様の方法でこちらの意図した形で出力できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問