概要
JSONの値を抽出するとき、awkコマンドが思いの外便利でしたので、記事にまとめてみます!
JSONの値の抽出には「jq」も便利ですが、インストールされていない場合には、awkを使用してみるのも手かと思います。
awkとは
awkとは、Linuxでサポートされているスクリプト言語で古くから(1977年~)存在しています。
下記のような特徴があります。
- 簡単な行ベースのテキストファイルを処理するのに適している
- 文字列に対して、フィールド区切り文字を指定して、処理することが可能
awkコマンドの基本操作
下記のような書式で書くことが多いです。
awk -F ‘[フィールドの区切り文字’] -v ‘変数=xx’ ‘{awkコマンド} file
標準出力を行うawkコマンド「print」を利用し、動作を確認していきます。
1フィールド目を取り出すコマンド
1フィールド目を取り出すには、「$1」を使います。
フィールドの区切り文字を指定しない場合、区切り文字にはタブまたは半角スペースが選択されます。
echo 1 2 3 4 | awk ‘{print $1}’
1
1
フィールド区切り文字を指定する
フィールド区切り文字に「”」を指定してみると、結果は下記のようになります。
echo 1″2″3″4 | awk -F'[“]’ ‘{print $2, $4}’
2 4
2 4
jsonの値の取得
元々やりたかったawkでjsonの値を取得する方法をご紹介します。
下記のようなJSONファイルがあると仮定します。
$ cat tel.json
{
“Taro”: “08012121111”,
“Jiro”: “09012122222”,
“Saburo”: “09012123333”
}
Jiroの値“09012122222”が欲しいとき、次のコマンドで抽出できます。
awk -F'[“]’ ‘/”Jiro”/{print $4}’ tel.json
太文字部分の「/”Jiro”/」を付けることで、Jiroを含む行を抽出しています。
JSONファイルがminifyされている場合
組み込み変数RSを使用して、レコードの区切り位置を変更します。
下記のようなJSONファイルがあると仮定します。
$ cat tel.json
{“Taro”: “08012121111”,“Jiro”: “09012122222”,“Saburo”: “09012123333”}
1行ずつ読み込めない場合は、レコードの区切り位置を指定します。
RSを使用することで、区切り文字を設定できます。
今回は、JSONファイルの区切りである「,」を区切り文字として設定します。
awk -F'[“]’ -v RS=, ‘/”Jiro”/{print $4}’ tel.json
最後に
awkコマンドは他にも色々な使用方法があり、テキストの成形には知っていて損はないコマンドだと思います。
JSONの操作にはjqコマンドも便利そうですので、また機会があったらまとめてみたいと思います!
コメント