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

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

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

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Q&A

解決済

1回答

16865閲覧

jqコマンドのエラー原因が分からない

teketeke

総合スコア46

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

1グッド

0クリップ

投稿2016/03/04 13:01

###前提・実現したいこと
AWS S3上に保存されている ClowdTrail のログファイル(~.gz形式)をローカルに取り込み、
ログのイベント発生時間でソートしたファイルを作成するスクリプトをCronで毎時動かしています。

今までは、処理のに時間は掛っていましたがエラーは発生していなかったみたいなのですが、
最近以下のエラーメッセージが発生しているのが見つかりました。
※メッセージはCronからメールで送られてきました。

エラーメッセージを検索してみたのですが、原因がわからなかったため、質問させていただきました。

OS:CentOS6.7
jq - commandline JSON processor [version 1.4]

###発生している問題・エラーメッセージ
jq: error: Cannot iterate over string
jq: error: string and array cannot be sorted, as they are not both arrays
jq: error: Cannot iterate over string
jq: error: string and array cannot be sorted, as they are not both arrays
~以下同じ~

現在、手動で実行、cronで実行してもメッセージは発生していません。
###ソースコード
スクリプトの中で、jqを使用しているのは、以下のコマンドなのですが、何が問題なのでしょうか。

bash

1find /var/log/trail-log/ -name "*.json.gz" | sort | xargs gunzip -c | /usr/bin/jq '.[] | sort_by(.eventTime) | .[]' | /usr/bin/jq '{awsRegion, eventName, eventTime, userName: .userIdentity.userName, requestParameters}' | /usr/bin/jq '"[\(.eventTime)] \(.awsRegion) \(.userName) \(.eventName) \(.requestParameters)"' > trail.log

###補足情報(言語/FW/ツール等のバージョンなど)

※参考として、.gzを解凍したファイルの中身を記載致します。
{"Records":[{"eventVersion":"1.03","userIdentity":{"type":"IAMUser","principalId":"xxxxxxxxxx","arn":"arn:aws:iam::xxxxxxxxxx:user/xxxxxxxxxx-user","accountId":"xxxxxxxxxx","accessKeyId":"xxxxxxxxxx","userName":"xxxxxxxxxx-user"},"eventTime":"2016-02-23T13:22:44Z","eventSource":"ec2.amazonaws.com","eventName":"DescribeInstances","awsRegion":"ap-northeast-1","sourceIPAddress":"xxx.xxx.xxx.xxx","userAgent":"aws-cli/1.9.7 Python/2.6.6 Linux/2.6.32-573.7.1.el6.x86_64 botocore/1.3.7","requestParameters":{"instancesSet":{},"filterSet":{"items":[{"name":"instance-id","valueSet":{"items":[{}]}}]}},"responseElements":null,"requestID":"xxxxxxxxxx-6e0f-434e-a5e7-xxxxxxxxxx","eventID":"xxxxxxxx-00c5-43a6-944a-xxxxxxxx","eventType":"AwsApiCall","recipientAccountId":"xxxxxxxxxx"},{"eventVersion":"1.03","userIdentity":{"type":"IAMUser","principalId":"xxxxxxxxxx","arn":"arn:aws:iam::xxxxxxxxxx:user/xxxxxxxxxx-user","accountId":"xxxxxxxxxx","accessKeyId":"xxxxxxxxxx","userName":"xxxxxxxxxx-user"},"eventTime":"2016-02-23T13:22:49Z","eventSource":"ec2.amazonaws.com","eventName":"DescribeInstances","awsRegion":"ap-northeast-1","sourceIPAddress":"xxx.xxx.xxx.xxx","userAgent":"aws-cli/1.9.7 Python/2.6.6 Linux/2.6.32-573.7.1.el6.x86_64 botocore/1.3.7","requestParameters":{"instancesSet":{},"filterSet":{"items":[{"name":"instance-id","valueSet":{"items":[{"value":"i-xxxxxxxx"}]}}]}},"responseElements":null,"requestID":"xxxxxxxx-25ee-465c-9a1f-xxxxxxxx","eventID":"xxxxxxxx-0c36-49cb-924e-xxxxxxxx","eventType":"AwsApiCall","recipientAccountId":"xxxxxxxx"},{"eventVersion":"1.03","userIdentity":{"type":"IAMUser","principalId":"xxxxxxxxxx","arn":"arn:aws:iam::xxxxxxxxxx:user/xxxxxxxxxx-user","accountId":"xxxxxxxxxx","accessKeyId":"xxxxxxxxxx","userName":"xxxxxxxxxx-user"},"eventTime":"2016-02-23T13:22:47Z","eventSource":"ec2.amazonaws.com","eventName":"DescribeInstances","awsRegion":"ap-northeast-1","sourceIPAddress":"xxx.xxx.xxx.xxx","userAgent":"aws-cli/1.9.7 Python/2.6.6 Linux/2.6.32-573.7.1.el6.x86_64 botocore/1.3.7","requestParameters":{"instancesSet":{},"filterSet":{"items":[{"name":"instance-id","valueSet":{"items":[{"value":"?i-xxxxxxxx?"}]}}]}},"responseElements":null,"requestID":"xxxxxxxx-3163-4b2f-88c0-xxxxxxxx","eventID":"xxxxxxxx-53af-4e93-abe4-xxxxxxxx","eventType":"AwsApiCall","recipientAccountId":"xxxxxxxxxx"}]}

ikuwow👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

"Cannot iterate over string"というメッセージはexecute.cの698行目
"cannot be sorted, as they are not both arrays"というメッセージはbuiltin.cに2箇所にあります。
おそらく、「sort」処理の対象になっているフィールドにStringとArrayが混在していてソートに失敗しているのではないでしょうか。
おそらく不正データなので該当するデータを削除するか、補正してやればエラーは回避できると思います。

投稿2016/03/04 13:40

rysh

総合スコア874

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

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

teketeke

2016/03/05 23:58

回答いただきありがとうございます。 もしご存知であれば、 StringとArrayが混在している可能性があるとのことなのですが、該当データがどれかをうまく調べる何か良い調査方法はご存知ないでしょうか。 .gzファイルが [リージョン(約10種)/年/月/日/(約5分ごとの~.gz)]のように取得されてくるので、ファイル数が多く、調査が難航しています。 ※調査方法は、書き込みました sort を実行しているコマンドを[日ディレクトリ]で手動で実行していますが、ファイルの量が多く処理に時間がかかり、又マシンの負荷が上がってしまい、すべてのディレクトリ調査が出来ていません。 たぶんスクリプト作って動かせばよいのかもしれませんが、load averageが5とか最悪10以上になってまともに動かなくなってしまって,,,
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問