/var/www/yatta47.log

やったのログ置場です。スクラップみたいな短編が多いかと。

JSONデータを見やすくするjqコマンドをインストールする

はー花粉症がひどい。

久しぶりの記事投稿ですね。今日はjqコマンドのインストールです。

ことの発端

ElasticSearchを使う機会があって、インデックス定義を確認したときにJSONが改行なしに表示されました。

[vagrant@localhost ~]$ curl 192.168.33.20:9200/logstash-2018.03.08
{"logstash-2018.03.08":{"aliases":{},"mappings":{"logs":{"dynamic_templates":[{"message_field":{"path_match":"message","match_mapping_type":"string","mapping":{"norms":false,"type":"text"}}},{"string_fields":{"match":"*","match_mapping_type":"string","mapping":{"fields":{"keyword":{"ignore_above":256,"type":"keyword"}},"norms":false,"type":"text"}}}],"properties":{"@timestamp":{"type":"date"},"@version":{"type":"keyword"},"column1":{"type":"text","norms":false,"fields":{"keyword":{"type":"keyword","ignore_above":256}}},"column5":{"type":"text","norms":false,"fields":{"keyword":{"type":"keyword","ignore_above":256}}},"column6":{"type":"text","norms":false,"fields":{"keyword":{"type":"keyword","ignore_above":256}}},"geoip":{"dynamic":"true","properties":{"ip":{"type":"ip"},"latitude":{"type":"half_float"},"location":{"type":"geo_point"},"longitude":{"type":"half_float"}}},"message":{"type":"text","norms":false},"tags":{"type":"text","norms":false,"fields":{"keyword":{"type":"keyword","ignore_above":256}}}}},"_default_":{"dynamic_templates":[{"message_field":{"path_match":"message","match_mapping_type":"string","mapping":{"norms":false,"type":"text"}}},{"string_fields":{"match":"*","match_mapping_type":"string","mapping":{"fields":{"keyword":{"ignore_above":256,"type":"keyword"}},"norms":false,"type":"text"}}}],"properties":{"@timestamp":{"type":"date"},"@version":{"type":"keyword"},"geoip":{"dynamic":"true","properties":{"ip":{"type":"ip"},"latitude":{"type":"half_float"},"location":{"type":"geo_point"},"longitude":{"type":"half_float"}}}}}},"settings":{"index":{"refresh_interval":"5s","number_of_shards":"5","provided_name":"logstash-2018.03.08","creation_date":"1523100510268","number_of_replicas":"1","uuid":"dkYwSI-sSIKZHJwONnFnrw","version":{"created":"6020399"}}}}}[vagrant@localhost ~]$

おいおい・・・・マジかよ・・・見づらくてしょうがねーよ!ってことで、jqで整形しようとしたところ、入っていないことに気がつき、インストールするという流れになりました。

単純にyumで入れようとしたらNo package となってしまったので、やり方の備忘録です。

# yum install jq
Loaded plugins: fastestmirror
base                                                                                                                         | 3.6 kB  00:00:00
elasticsearch-6.x                                                                                                            | 1.3 kB  00:00:00
extras                                                                                                                       | 3.4 kB  00:00:00
kibana-6.x                                                                                                                   | 1.3 kB  00:00:00
logstash-5.x                                                                                                                 | 1.3 kB  00:00:00
updates                                                                                                                      | 3.4 kB  00:00:00
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
No package jq available.
Error: Nothing to do

ちなみに環境はCentOS7です。

[root@localhost vagrant]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@localhost vagrant]#

 

インストールする方法

  • yumでインストールする方法
  • バイナリを持ってきてインストールする方法

今回は、前者の「yumでインストールする方法」で実行します。

 

yumでjqをインストールする

EPELリポジトリを追加する

EPELリポジトリからjqコマンドを取ってこれるように設定します。

署名済みのPGP鍵もしくは公開されている署名された鍵をインポートします。

# rpm --import http://ftp.riken.jp/Linux/fedora/epel/RPM-GPG-KEY-EPEL-7

EPELリポジトリの情報を追加します。

# vi /etc/yum.repos.d/epel.repo
[epel]
name=EPEL RPM Repository for Red Hat Enterprise Linux
baseurl=http://ftp.riken.jp/Linux/fedora/epel/7/$basearch/
gpgcheck=1
enabled=0

普段日常的には使わないようにしようということで、enabled=0に設定。

 

yumでインストール

いざコマンド実行。

EPELリポジトリenable=0で常時読み込まないようにしているので、コマンドライン上で--enablerepo=epelを追加して実行します。

# yum --enablerepo=epel install jq
Loaded plugins: fastestmirror
epel                                                                                                                         | 4.7 kB  00:00:00
(1/3): epel/x86_64/group_gz                                                                                                  | 266 kB  00:00:00
(2/3): epel/x86_64/primary_db                                                                                                | 6.3 MB  00:00:01
(3/3): epel/x86_64/updateinfo                                                                                                | 907 kB  00:00:06
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
Resolving Dependencies
--> Running transaction check
---> Package jq.x86_64 0:1.5-1.el7 will be installed
--> Processing Dependency: libonig.so.2()(64bit) for package: jq-1.5-1.el7.x86_64
--> Running transaction check
---> Package oniguruma.x86_64 0:5.9.5-3.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

====================================================================================================================================================
 Package                             Arch                             Version                                  Repository                      Size
====================================================================================================================================================
Installing:
 jq                                  x86_64                           1.5-1.el7                                epel                           153 k
Installing for dependencies:
 oniguruma                           x86_64                           5.9.5-3.el7                              epel                           129 k

Transaction Summary
====================================================================================================================================================
Install  1 Package (+1 Dependent package)

Total download size: 282 k
Installed size: 906 k
Is this ok [y/d/N]: y
Downloading packages:
(1/2): jq-1.5-1.el7.x86_64.rpm                                                                                               | 153 kB  00:00:00
(2/2): oniguruma-5.9.5-3.el7.x86_64.rpm                                                                                      | 129 kB  00:00:05
----------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                46 kB/s | 282 kB  00:00:06
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : oniguruma-5.9.5-3.el7.x86_64                                                                                                     1/2
  Installing : jq-1.5-1.el7.x86_64                                                                                                              2/2
  Verifying  : oniguruma-5.9.5-3.el7.x86_64                                                                                                     1/2
  Verifying  : jq-1.5-1.el7.x86_64                                                                                                              2/2

Installed:
  jq.x86_64 0:1.5-1.el7

Dependency Installed:
  oniguruma.x86_64 0:5.9.5-3.el7

Complete!
[vagrant@localhost ~]$
[vagrant@localhost ~]$

インストール完了

これでインストールが完了しました。

elasticsearchのインデックス定義をjqをかまして確認してみます。

$ curl 192.168.33.20:9200/logstash-2018.03.08 | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1796  100  1796    0     0   301k      0 --:--:-- --:--:-- --:--:--  350k
{
  "logstash-2018.03.08": {
    "aliases": {},
    "mappings": {
      "logs": {
        "dynamic_templates": [
          {
            "message_field": {
              "path_match": "message",
              "match_mapping_type": "string",
              "mapping": {
                "norms": false,
                "type": "text"
              }
            }
          },
          {
            "string_fields": {
              "match": "*",
              "match_mapping_type": "string",
              "mapping": {
                "fields": {
                  "keyword": {
                    "ignore_above": 256,
                    "type": "keyword"
                  }
                },
                "norms": false,
                "type": "text"
              }
            }
          }
        ],
        "properties": {
          "@timestamp": {
            "type": "date"
          },
          "@version": {
            "type": "keyword"
          },
          "column1": {
            "type": "text",
            "norms": false,
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "column5": {
            "type": "text",
            "norms": false,
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "column6": {
            "type": "text",
            "norms": false,
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "geoip": {
            "dynamic": "true",
            "properties": {
              "ip": {
                "type": "ip"
              },
              "latitude": {
                "type": "half_float"
              },
              "location": {
                "type": "geo_point"
              },
              "longitude": {
                "type": "half_float"
              }
            }
          },
          "message": {
            "type": "text",
            "norms": false
          },
          "tags": {
            "type": "text",
            "norms": false,
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      },
      "_default_": {
        "dynamic_templates": [
          {
            "message_field": {
              "path_match": "message",
              "match_mapping_type": "string",
              "mapping": {
                "norms": false,
                "type": "text"
              }
            }
          },
          {
            "string_fields": {
              "match": "*",
              "match_mapping_type": "string",
              "mapping": {
                "fields": {
                  "keyword": {
                    "ignore_above": 256,
                    "type": "keyword"
                  }
                },
                "norms": false,
                "type": "text"
              }
            }
          }
        ],
        "properties": {
          "@timestamp": {
            "type": "date"
          },
          "@version": {
            "type": "keyword"
          },
          "geoip": {
            "dynamic": "true",
            "properties": {
              "ip": {
                "type": "ip"
              },
              "latitude": {
                "type": "half_float"
              },
              "location": {
                "type": "geo_point"
              },
              "longitude": {
                "type": "half_float"
              }
            }
          }
        }
      }
    },
    "settings": {
      "index": {
        "refresh_interval": "5s",
        "number_of_shards": "5",
        "provided_name": "logstash-2018.03.08",
        "creation_date": "1523100510268",
        "number_of_replicas": "1",
        "uuid": "dkYwSI-sSIKZHJwONnFnrw",
        "version": {
          "created": "6020399"
        }
      }
    }
  }
}
[vagrant@localhost ~]$

うん。見やすくなった。

 

まとめ

jqコマンドはJSONデータを扱うときにつかうととても便利ですね。

AWS関連のデータ定義もJSONだし、JSONデータは個人的にかなり身近なのでこのコマンドがあるのないのとじゃ大きな違いがあります。

ちなみになんでElasticSearchを触っているかというと、ちょっとデータ分析等をやらないといけなくなったのでひとまずlogstash、Fluentd、ElasticSearch、Kibana、Grafanaを一通りこの本に頼って触っている状態です。

Elasticsearchのマッピング、意味わからねー。理解できてねー。

データ分析でわかりやすい本とか記事があったらそっとブコメ付けておいてもらえるととても助かります!よろしくお願いします!!

Real Time Web Analytics