برنامه نویسی

FZF + JQ = JQ تعاملی (+ جایزه vim)

fzf + jq

مسئله

آیا اغلب از یک API پرس و جو می کنید و یک بار بزرگ JSON دریافت می کنید، مانند:

$ curl https://jsonplaceholder.typicode.com/todos
[
  {
    "userId": 1,
    "id": 1,
    "title": "delectus aut autem",
    "completed": false
  },
  ...
]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بنابراین شما آن را لوله کنید jq، اما ای کاش می توانستید به صورت تعاملی داده ها را پرس و جو کنید؟

ممکن است با برخی از ابزارهای کمکی که این تعامل را فراهم می کنند آشنا باشید، مانند jqp، اما اینها جنبه های منفی خود را دارند، یعنی باگ های ظریف به دلیل اجرای مجدد JQ اصلی در زبان X، اما همچنین وابستگی های اضافی هستند که باید برای معماری پلت فرم و سیستم عامل/توزیع خود ردیابی و نصب کنید.

راه حل

اینجا یک هک است (اشتباه… ✨ طرفدار نکته ✨) برای دریافت تعامل JQ به صورت “رایگان” (تا زمانی که دارید fzf روی دستگاه شما):

$ echo '' | fzf --print-query --preview "cat $JSON_FILE_ON_DISK | jq {q}"
$ echo '' | fzf --print-query --preview "cat <(curl $API_URL) | jq {q}"
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این چطوری کار میکنه؟

echo '' | fzf --print-query --preview "cat $JSON_FILE_ON_DISK | jq {q}"
^^^^^^^   ^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  [1]          [2]                          [3]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  1. هنگام دویدن fzf، به طور پیش فرض از شما می خواهد که در فهرستی از فایل ها در فهرست کار فعلی خود جستجوی فازی داشته باشید. بنابراین، ما این را سرکوب می کنیم echoقرار دادن یک رشته خالی در fzf.

  2. --print-query یک پرچم اختیاری است که درخواستی را که ما تایپ کرده‌ایم چاپ می‌کند وارد.

  3. --preview پرچم چیزی است که همه اینها را قادر می سازد. ما از قابلیت پیش نمایش fzf استفاده می کنیم cat محتوای JSON را خارج کنید، آن را به آن لوله کنید jq، تزریق پرس و جو ما به عنوان jq استدلال از طریق {q} placeholder، و نتایج را در پنجره پیش نمایش fzf مشاهده می کنیم.

بهبودهای بیشتر

ما می‌توانیم با ایجاد یک اسکریپت پوسته در جهانی خود، این را بیشتر بهبود ببخشیم $PATH تا آن را به یک ابزار مفید سریع تبدیل کنید.

به عنوان مثال، با فرض نامگذاری این اسکریپت fjq:

#!/bin/bash

echo '' | fzf-tmux -p '80%' --print-query --preview "cat ${1} | jq {q}"
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون می توانیم از این استفاده کنیم:

# interactive jq on a single JSON file
$ fjq file.json

# interactive jq on a directory with multiple JSON files
$ fjq /path/to/*.json

# interactive jq on-the-fly
$ fjq <(curl https://jsonplaceholder.typicode.com/todos)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

وایلا! پرس و جوی تعاملی json با just jq و fzf.

نکته Vim

با استفاده از Vim’s می توان به یک تجربه نیمه تعاملی (بدون FZF) دست یافت. :! و :help filter برای فیلتر کردن محتویات بافرهای Vim از طریق یک برنامه خارجی و نوشتن خروجی در بافرهای Vim، مانند:

$ curl https://jsonplaceholder.typicode.com/todos | vim -

# inside vim ...

:%! jq .[].completed
:%! sort | uniq -c
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ما حتی می توانیم از اسکریپت قبلی خود برای تعامل کامل JQ استفاده کنیم:

:! fjq %
" or
:%! fjq %
" or 
:0read ! fjq %
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

و غیره.

نتیجه

ما دیده‌ایم که چگونه برنامه‌های ترمینال و ابزارهای پوسته می‌توانند برای ایجاد گردش‌های کاری قدرتمند ترکیب شوند.

ما 2 تا 3 ابزاری را که قبلاً در سیستم ما وجود دارد استفاده کردیم و 80٪ از آنچه ابزارهای دیگر سعی می کنند با پیاده سازی مجدد انجام دهند به دست آوردیم. jq در Go، Ruby، Rust، Python، Node.js … و غیره.

این بدان معنا نیست که نباید به سراغ این ابزارهای اضافی بروید، اما، در بسیاری از موارد، یادگیری نحوه استفاده از ابزارهای موجود، شما را قادر می سازد تا مشکلات بیشتری را نسبت به آنچه این ابزارها برای آن ساخته شده اند، حل کنید.

هک مبارک! 😄

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا