dium
dium
خواندن ۷ دقیقه·۴ سال پیش

جایگزینی (بهینه‌تر) برای برخی ابزارهای یونیکس

1. RipGrep

یکی از روش‌های مرسوم برای جست‌وجوی عبارت در سیستم‌های برپایهٔ یونیکس استفاده از دستور grep هست و در قریب به اتفاق توزیع‌هایی که از هسته لینوکس استفاده می‌کنند به صورت پیش‌فرض نصب هست. اگر فرض رو بگذاریم بر اینکه شما یک رایانهٔ معمولی دارید و قصد جست‌وجوی عبارتی خاص در میان ۵۰۰ گیگابایت فایل (ASCII) را کرده‌اید، استفاده از grep در چنین موقعیتی بسیار هزینه‌بر هست (منابع-زمان) یک جایگزین مناسب برای این دستور که در بین مدیران سیستم‌ها و کاربران یونیکس علاقه‌مندان زیادی رو به خودش جذب کرده ripgrep هست.

https://github.com/BurntSushi/ripgrep

خوشبختانه این ابزار در مخازن توزیع‌های پرکاربر لینوکس گنجانده شده، برای نصب در اوبونتو یا دبیان با استفاده از apt:

sudo apt install ripgrep

یکی از آزمایش‌های جالبی که برای مقایسه grep (GNU grep) و ripgrep شده جست‌و‌جوی یک عبارت در فایلی تقریبا ۱۳ گیگابایتی است که در آن ripgrep بیش از ۳برابر در زمان عملکرد بهتری نسبت به grep دارد و اگر از فلگ n (برای نمایش اینکه عبارت مدنظر ما در کدام خط از فایل قرار دارد) استفاده شود ripgrep در 3.423 و grep در 13.031 ثانیه قادر به اتمام فرآیند جست‌وجو و نمایش اطلاعات هستند. یعنی برتری نزدیک ۴ برابری ripgrep نسبت به grep در زمان جست‌وجو.


در اینجا ابزاری که برای بررسی عملکرد سرعت برنامه‌ها به شکل CLI استفاده می‌شود hyperfine نام داره، برای آزمایش و بررسی سرعت عمل برنامه‌ها شما می‌توانید از هایپرفاین استفاده کنید.
مقایسه دستور fd با find
مقایسه دستور fd با find

2. FD

غالبا کاربران لینوکس برای جست‌وجوی فایل درون سیستم خودشون از دستور find استفاده می‌کنند. find هم یکی از ابزارهایی هست که مبتنی بر استانداردهای POSIX و شبیه دستور grep که در بالا گفته شده به صورت پیشفرض روی بیشتر توزیع‌های لینوکسی نصب شده هست. توی حالتی قرار گرفتید که پوشه‌های متعدد درهم و درون هر پوشه هزاران فایل با انواع فرمت و انواع نام داشته باشید و قصد بکنید فایلی رو پیدا بکنید؟ دو حالت رو متصور هستیم در چنین شرایطی که یا با استفاده از مدیریت فایل و یا با استفاده از دستور find دنبال این فایل می‌گردید.

استفاده از دستور find در تصویری که کمی بالاتر قرار گرفته رو مشاهده می‌کنید و مقایسه find با fd که در اون دستور fd در شرایطی یکسان سرعتی چند برابر نسبت به دستور find رو داره.

‍‍‍Benchmark #1: find ~ -iregex '.*[0-9]\.jpg$' Time (mean ± σ): 7.236 s ± 0.090 s Range (min … max): 7.133 s … 7.385 s

استفاده از find بدون الگوهای regex که سرعت بهتری رو به این ابزار میده:

Benchmark #2: find ~ -iname '*[0-9].jpg' Time (mean ± σ): 3.914 s ± 0.027 s Range (min … max): 3.876 s … 3.964 s

و اما دستور fd:


Benchmark #3: fd -HI '.*[0-9]\.jpg$' ~ Time (mean ± σ): 811.6 ms ± 26.9 ms Range (min … max): 786.0 ms … 870.7 ms

و یک شوخی کوچک:

For this particular example, fd is approximately nine times faster than find -iregexand about five times faster than find -iname. By the way, both tools found the exact same 20880 files ?.

نصب از مخازن اوبونتو یا دبیان:

sudo apt install fd-find

فدورا:

dnf install fd-find

آرچ:

pacman -S fd

پیوند به مخزن این برنامه در گیت‌هاب و دریافت نسخهٔ کامپایل شده برای توزیع‌ها با معماری‌های مختلف:

https://github.com/sharkdp/fd

آیا ابزاری سریع‌تر از fd وجود دارد؟ پاسخ: بله، در شرایط متعددی ff سرعتی در حد چند میلی‌ثانیه بیشتر از fd خواهد شد.

پیوند به مخزن ff:

https://github.com/vishaltelangre/ff/
یک نمونه از خروجی دستور ff
یک نمونه از خروجی دستور ff

3. Bat

دستور cat یکی از مهم‌‌ترین دستورات مرتبط با متن در سیستم‌های یونیکس/شبه‌یونیکس هست. خروجی این دستور رو وقتی مشاهده می‌کنید شاید بدون رنگ و لعاب بودنش به چشم بیاد، نبود امکان انتخاب بازه‌ای برای نمایش خطوط و هماهنگی با git (کدهای جدید اضافه شده به برنامه یا حذف شده) و یا حتی صفحه بندی که دیگه نیاز نباشه فایلی رو با less یا more بخونیم یا آخر کار یک pipe و بعدش less نگذاریم و خیلی موارد دیگه که در cat احساس نیاز میشه به اون‌ها، خبر خوش اینجاست که bat تمامی این امکانات و به همراه تعداد بیشتری قابلیت‌های دیگر داره که هنگام کار با این ابزار متوجه خواهید شد.

قابلیت شناسایی دستور زبان و هماهنگی با git هنگام خواندن یک فایل با فرمت html
قابلیت شناسایی دستور زبان و هماهنگی با git هنگام خواندن یک فایل با فرمت html

این ابزار هم جای خودش رو در مخازن توزیع‌های مختلف بازکرده و به سهولت امکان نصب اون رو در توزیع خودتون خواهید داشت. برای آشنایی بیشتر با این ابزار یا نصب از طرق مختلف نگاهی داشته به مخزن این برنامه در گیت‌هاب:

https://github.com/sharkdp/bat


4. lsd (LSDeluxe)

ابزار lsd نسل نو و جایگزینی مناسب برای دستور ls هست. تصویر زیر می‌تونه گویای همه‌چیز باشه:

تصویری که جای توضیحی باقی نمی‌گذاره از خروجی این دستور
تصویری که جای توضیحی باقی نمی‌گذاره از خروجی این دستور

5. exa

جایگزینی دیگر برای ls هست با کارایی بیشتر از نمایش درختی پوشه‌ها و فایل‌ها (که شما بی‌نیاز به نصب دستور tree خواهید شد) تا نمایش آیکن‌ها.

دستور exa و متعلقات
دستور exa و متعلقات

دستور exa را می‌توان طبق گفتهٔ برنامه‌نویس آن جایگزینی جدید و کارا برای دستور ls دانست.

https://github.com/ogham/exa/

6. ytop

از دستور top برای نمایش پروسه‌های در حال اجرا روی سیستم خودتون استفاده می‌کنید؟ جایگزین خوبی که منابع کمی از سیستم شما رو می‌گیره ytop نام داره که استفاده از اون دشواری نداره و می‌شه اون رو یکی از گزینه‌های خوب برای استفاده جای top دانست. در این میان برنامهٔ htop هم جایگاه خوبی داره و امکاناتی درخور رو داراست.

برنامه ytop در حال اجرا
برنامه ytop در حال اجرا

https://github.com/cjbassi/ytop

7. dust

از برای اطلاع از اوضاع ظرفیت دیسک یا فضای که توسط فایل‌ها اشغال شده از du استفاده می‌کنید؟ نگاهی به dust داشته باشید، ابزاری که تمام امکانات du را به همراه امکانات جانبی دارد که با وجود آن مشتری dust خواهید شد وقتی که می‌خواهید ببینید فضای ذخیره‌سازی در سیستم شما به چه شکل است یا کدام فایل یا پوشه حجم بیشتری را در بر می‌گیرد.

خروجی دستور dust
خروجی دستور dust

8. sd

شاید sed را بتوان یک ابزار تمام عیار برای جایگزینی عبارت‌های متنی در سیستم‌های یونیکسی دانست. کار با sed شاید مهارت‌های خاصی را بطلبد و پیچدگی هم داشته باشد. sd این مشکلات را رفع کرده به گونه‌ای که تنها عباراتی که قصد تغییرشان را دارید با عبارت جدید جایگزین کنید بدون هیچ دردسر دیگری.

نکته‌ای که خوبه به اون توجه بشه سرعت بالای sd در مقابل sed هست که هنگام کار با فایل‌هایی که حجم بالایی دارند به اون پی خواهید برد. این سرعت گاه تا ۱۲ برابر بیشتر هم خودش رو نشون می‌ده.

Command Mean [s] Min…Max [s]
sed -E &quots:(\w+):\1\1:g&quot dump.json >/dev/null 11.315 ± 0.215 11.102…11.725 sed 's:\(\w\+\):\1\1:g' dump.json >/dev/null 11.239 ± 0.208 11.057…11.762 sd &quot(\w+)&quot &quot$1$1&quot dump.json >/dev/null 0.942 ± 0.004 0.936…0.951
  • فایل dump.json حجمی تقریبا معادل ۵۵ مگابایت دارد.

9. teip


دستور sd که بالا معرفی شد جایگزینی بود برای sed، یک ابزاری که هم کار sed و هرآنچه با awk میشه با اون انجام داد دستور teip هست.

دستور teip اجرا شده برای جایگزینی ۱۵ حرف اول با زمان کنونی در قالب ثانیه بر اساس استاندارد POSIX یا Epoch time
دستور teip اجرا شده برای جایگزینی ۱۵ حرف اول با زمان کنونی در قالب ثانیه بر اساس استاندارد POSIX یا Epoch time


لینوکسیونیکسcliترمینالبرنامه‌نویسی
ممنون می‌شوم اگر اشتباه‌های من را گوشزد کرده و به من بیاموزید. باتشکر
شاید از این پست‌ها خوشتان بیاید