シェル内のJSONパイプ

シェルにワンライナーを記述するほど、2つの重要なアイデアが浮かび上がります。
  1. これは、「直接プログラミング」、つまりコンピューターに何をすべきかを伝えるための非常に強力なツールです。
  2. 単一行のほとんどはgrep / awk / cut / trに専念しており、以前のユーティリティの出力を何らかの形で取り出して人間の形にします。


パイプモデルは驚くべきものであるにもかかわらず、2番目の段落の出力で必要なフィールドをキャッチするための完全にダーティなハック(「ここで、awk -F、 '{print $ 2}'を使用して特性コンマを使用して必要なフィールドを選択できます... )手順を喜びのために物議を醸し、確かに読めないようにします。



別の深刻な問題:シェルは関数型プログラミングから非常に多くのイディオムを提供するという事実にもかかわらず、外部プログラムの実行結果によってリストをフィルタリングするイディオムがありません。 つまり、リストを「挽く」ことができます。 しかし、あるプログラムが「成功」を返した要素のみをリストに残します-いいえ。



同時に、敵対的であまりよく書かれていない環境があります-powershell(Windows)。 そこでは、彼らは良いアイデアを取りましたが(パイプはテキストではなくオブジェクトを送信します)、次の2つの点でそれを台無しにしました。
  1. Windowsの非人間工学的コンソール( Shift-PgUpどこで、新しいバージョンではCtrl-PdUpと言います)
  2. メソッドを適切に機能させるために、.netにアクセスして学習することをお勧めします。
  3. ほとんどのオペレーティングシステムの不足




暖かいLinux Linuxシェルのパイプにオブジェクトを入れたいです。 ハンドキャンディー(タイピングが少ない)、アイキャンディー(見た目が良い)および人間工学に基づいた全体的な使用。 また、「新しいアプローチ」と古い、つまり通常のテキストパイプを組み合わせることもできます。



アイデア



パイプスタイルの構造化データを操作できるツールのセットを作成する必要があります。 明らかな選択肢はXML JSONです。

必要なもの:
  1. 標準入力形式を受け入れ、それらをjsonに変換するユーティリティ。
  2. パイプがjsonを操作できるようにするユーティリティ。
  3. jsonを「通常の」形式に変換するユーティリティ。


この場合、ユーザーは画面にjsonを表示しませんが、jsonを操作できます。



種子用



(理解のために、私は長いユーティリティ名を書きます。実際には、短い略語、つまりjson-get-objectではなく、jgoやjgのようなものになります)



タイプを判別するために管理されたファイルのファイルのみを表示します。

ls -la | ls2json | json-filter 'filename' --exec 'file {} >/dev/null' | json-print







特定のサイトから認証用のトークンをダウンロードし、jsonからそれを取り出して環境変数に設定します。その後、リストをダウンロードし、regexpによって著者フィールドをフィルターで除外し、すべてのURLをダウンロードします。

curl mysite/api.json | env `json-get-to-env X-AUTH-TOKEN`;curl -H X-AUTH-TOKEN $X-AUTH-TOKEN mysite/api/list.json | json-filter --field 'author' --rmatch 'R.{1,2}dal\d*' | json-get --field 'url' | xargs wget







find -lsの出力を解析し、サイズフィールドでソートし、配列から要素を10から20に切り取り、csvに出力します。

find . -ls | ls2josn | json-sort --field 'size' | json-slice [10:20] | json2csv







用語



入力



主なタスクは、乱雑な出力からjson-candyを作成することです。 重要:間違った入力を処理するオプションがあります:a)無視、b)エラーでパイプを停止します。



例:

ジェネリック:



アプリ固有:





プライベートで促されるように、mysql-jsonはこの考えに完全に適合します。 SQLからの出力でバイナリを実行しますか? 簡単です。



ファイル固有:

ファイルを読み取り、jsonで出力します。





ネイティブJSON変換



最もおいしいのは、ネイティブのjson操作です。 同様に、「jsonではない」-「無視」/「停止」という処理オプションが必要です。

(好みとニーズに追加)



出力



jsonを人間が読める形式で提供します。





イテレータ



実際、jsonのxargs拡張機能:





難しさ



もちろん、このような方法で任意のjsonを処理する問題を解決することは不可能です-あまりにも「構造化されていない」ことが判明する場合があります。 しかし、第一に、入力はjsonを予測可能に見せ、第二に、jsonの処理は既存のシェルの「要素がシェル内でスペースで区切られている」などの処理よりもさらに予測可能です。



実装



私は自分でそれを書きますが、何が必要なのか分からず、何かに十分な時間がありません。 プログラマーではありません。 この記事の秘密のアイデアは、「誰かが私のために書く」というものですが、これが見つからなければ、少なくとも自分でやり遂げる動機を備えたプログラム記事があります。



誰かがこれに取り組む準備ができているなら、私は非常に感謝します。 そうでない場合は、fig pythonを見つけます。アイデアや提案は大歓迎です。



更新:人々は少し動いたようです。 コミットはここで歓迎されます: github.com/amarao/json4shell 。 使用できるかどうかはまだわかりません。 十分な火薬がありますか-私も知りません。



All Articles