はー花粉症がひどい。
久しぶりの記事投稿ですね。今日は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のマッピング、意味わからねー。理解できてねー。
データ分析でわかりやすい本とか記事があったらそっとブコメ付けておいてもらえるととても助かります!よろしくお願いします!!