FZF + JQ = JQ تعاملی (+ جایزه vim)
مسئله
آیا اغلب از یک 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]
-
هنگام دویدن
fzf
، به طور پیش فرض از شما می خواهد که در فهرستی از فایل ها در فهرست کار فعلی خود جستجوی فازی داشته باشید. بنابراین، ما این را سرکوب می کنیمecho
قرار دادن یک رشته خالی درfzf
. -
--print-query
یک پرچم اختیاری است که درخواستی را که ما تایپ کردهایم چاپ میکند وارد. -
--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 … و غیره.
این بدان معنا نیست که نباید به سراغ این ابزارهای اضافی بروید، اما، در بسیاری از موارد، یادگیری نحوه استفاده از ابزارهای موجود، شما را قادر می سازد تا مشکلات بیشتری را نسبت به آنچه این ابزارها برای آن ساخته شده اند، حل کنید.
هک مبارک! 😄