Pipeline در خط فرمان لینوکس

توانایی خواندن اطلاعات از ورودی استاندارد و ارسال آن به خروجی استاندارد با یک ویژگی Shell به نام Pipeline یا کاراکتر خط عمودی | ایجاد شده است.
با استفاده از عملگر خط عمودی، خروجی استاندارد یک فرمان به داخل ورودی استاندارد فرمانی دیگر ریخته میشود.
به عنوان مثال:
1 |
command1 | command2 |
با این کار فرمان اول هر خروجی که داشته باشد به داخل ورودی فرمان دوم ریخته میشود. برای توضیح کامل آن از فرمان less استفاده میشود. فرمان less فرمانی است که ورودی استاندارد را قبول میکند. برای توضیح کامل آن از فرمان less استفاده میگردد. فرمان less فرمانی است که ورودی استاندارد را قبول میکند.
میتوان از فرمان less برای نمایش صفحه به صفحه خروجی هر فرمانی استفاده نمود. به عنوان مثال:
1 |
[me@linuxbox ~]$ ls -l /usr/bin | less |
ملاحظه میشود با استفاده از علامت پایپ | خروجی فرمان ls –l /usr/bin را به داخل ورودی فرمان less ریخته شده است.
فیلترها
پایپلاین (Pipeline) اغلب برای انجام عملیاتهای پیچیده بر روی داده استفاده میشود. ممکن است که چندین فرمان را با استفاده از Pipeline به هم متصل شود. فرمانهایی که به این شیوه استفاده میشوند را فیلتر مینامند. فیلترها ورودی را دریافت کرده آن را تغییر داده و سپس در خروجی نمایش میدهند. اولین فیلتری که امتحان خواهد شد sort میباشد. تصور نمایید که میخواهیم یک لیست ترکیبی از برنامههای اجرایی /bin و /usr/bin ایجاد کرده و آنها را مرتب کنیم و لیست را نمایش دهیم:
1 |
[me@linuxbox ~]$ ls /bin /usr/bin | sort | less |
از آنجایی که ما دو پوشه /bin و /usr/bin را تعیین کردهایم خروجی فرمان ls از دو لیست مرتب شده، یکی برای هر شاخه، ولی با اضافه کردن فیلتر sort با استفاده از Pipeline، داده در لیست مرتب شده نمایش داده میشود.
فرمان uniq – گزارش یا حذف خطوط تکراری
فرمان uniq همانطور که از نام آن برمیآید (به معنی یگانه و منحصر به فرد) با خطوط تکراری مشکل دارد. فرمان uniq اغلب در کنار sort به کار میرود. فرمان uniq یک لیست مرتب شده از دادهها را از ورودی استاندارد یا یک آرگومان نام فایل قبول میکند، و به صورت پیشفرض هر خط تکراری موجود در لیست را حذف میکند. پس برای اینکه مطمئن شویم لیست ما هیچ مورد تکراری ندارد (که در این مورد که مثال میزنیم نام برنامههاست که در هر دو پوشه /bin و /usr/bin وجود دارد) بایستی فرمان uniq را به پایپلاینهای خود اضافه نمود:
1 |
[me@linuxbox ~]$ ls /bin /usr/bin | sort | uniq | less |
در این مثال از فرمان uniq برای حذف هر مورد اضافی از خروجی فرمان sort استفاده شده است. اگر به جای حذف بخواهیم لیست موارد تکراری را مشاهده کنیم میتوان از گزینه –d استفاده نمود:
1 |
[me@linuxbox ~]$ ls /bin /usr/bin | sort | uniq -d | less |
فرمان wc – نمایش تعداد بایت، کلمه و خط
فرمان wc سرنام عبارت Word Count به معنی تعداد کلمات است. این فرمان به منظور نمایش تعداد خطوط، کلمات و بایتهای موجود در فایلها به کار میرود:
1 2 |
[me@linuxbox ~]$ wc ls-output.txt 7902 64566 503634 ls-output.txt |
در این مورد فرمان، سه شماره را نمایش میدهد: تعداد خطوط (۱)، تعداد کلمات (۹) و تعداد بایتهای موجود (۵۴) در لیست ls-output.txt. همانند فرمانهای قبلی اگر بدون آرگومانهای خط فرمان به کار رود، استاندارد ورودی را دریافت میکند. گزینه –l خروجی را محدود میکند و فقط تعداد خطوط را نشان میدهد. اضافه نمودن آن به یک Pipeline میتواند روش خوبی برای شمارش موارد باشد. برای مشاهده تعداد آیتمهایی که ما در لیست مرتب وجود دارد میتوان فرمان زیر را بهکار برد:
1 2 |
[me@linuxbox ~]$ ls /bin /usr/bin | sort | uniq | wc -l 2728 |
فرمان grep – نمایش خطوطی که الگوی خاصی دارند
grep یک برنامه قدرتمند است که به منظور پیدا کردن الگوی خاص متن در داخل فایلها به کار میرود، به این صورت به کار میرود:
1 |
grep pattern [file...] |
وقتی که grep با یک الگو (pattern) در فایل مواجه میشود، خطی که آن الگو در داخل آن وجود دارد را در صفحهنمایش چاپ میکند. الگوهایی که grep میتواند داشته باشد ممکن است بسیار پیچیده باشد ولی در حال حاضر چون قصد داریم تمرکز را بر روی آموزش بگذاریم، از موارد ساده استفاده میشود. به الگوهای پیشرفته را در درسهای آینده پرداخته خواهد شد.
فرض کنید که میخواهیم همه فایلهایی که در داخل لیست برنامهها وجود دارند و دارای کلمه zip در نام خود هستند را پیدا کنیم. چنین جستجویی میتواند برای یافتن فایلهای فشرده کاربردی باشد. مثال زیر گویای مطلب است:
1 2 3 4 5 6 7 8 9 10 11 12 |
[me@linuxbox ~]$ ls /bin /usr/bin | sort | uniq | grep zip bunzip2 bzip2 gunzip gzip unzip zip zipcloak zipgrep zipinfo zipnote zipsplit |
گزینههای کاربردی خوبی برای فرمان grep وجود دارد. مثلاً –i که باعث میشود grep هنگام اجرا بزرگی و کوچکی حروف را نادیده بگیرد. (معمولاً جستجوها حساس به بزرگی و کوچکی هستند.) همچنین گزینه –v به grep میگوید که فقط خطوطی را چاپ کن که با الگو مطابقت ندارند.
head/tail – بخش اول و آخر فایلها را چاپ میکند
گاهی اوقات شما همه خروجی یک فرمان را نمیخواهید. شاید فقط چند خط اول و یا چند خط آخر خروجی را بخواهید. فرمان head ده خط اول و فرمان tail ده خط آخر از خروجیهای فرمان را چاپ میکند. بهصورت پیشفرض هر دو فرمان، ده خط از متن را چاپ میکنند ولی با استفاده از گزینه –n میتوانید این مقدار را تغییر دهید.
1 2 3 4 5 6 7 8 9 10 11 12 |
[me@linuxbox ~]$ head -n 5 ls-output.txt total 343496 -rwxr-xr-x 1 root root 31316 2011-12-05 08:58 [ -rwxr-xr-x 1 root root 8240 2011-12-09 13:39 411toppm -rwxr-xr-x 1 root root 111276 2011-11-26 14:27 a2p -rwxr-xr-x 1 root root 25368 2010-10-06 20:16 a52dec [me@linuxbox ~]$ tail -n 5 ls-output.txt -rwxr-xr-x 1 root root 5234 2011-06-27 10:56 znew -rwxr-xr-x 1 root root 691 2009-09-10 04:21 zonetab2pot.py -rw-r--r-- 1 root root 930 2011-11-01 12:23 zonetab2pot.pyc -rw-r--r-- 1 root root 930 2011-11-01 12:23 zonetab2pot.pyo lrwxrwxrwx 1 root root 6 2012-01-31 05:22 zsoelim -> soelim |
همچنین میتوان با Pipeline آن را ترکیب کرد:
1 2 3 4 5 6 |
[me@linuxbox ~]$ ls /usr/bin | tail -n 5 znew zonetab2pot.py zonetab2pot.pyc zonetab2pot.pyo zsoelim |
tail گزینهای دارد که به شما اجازه میدهد تا فایلها را بهصورت زنده و در زمان واقعی (real time) مشاهده کنید. این ویژگی برای مشاهده پیشرفت و روند فایلهای log بسیار مفید است. در مثال زیر نگاهی به فایلهای پیام در مسیر /var/log میاندازیم. به این منظور دسترسی Super User نیاز است. چون /var/log/message دارای برخی اطلاعات امنیتی است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[me@linuxbox ~]$ tail -f /var/log/messages Feb 8 13:40:05 twin4 dhclient: DHCPACK from 192.168.1.1 Feb 8 13:40:05 twin4 dhclient: bound to 192.168.1.4 -- renewal in 1652 seconds. Feb 8 13:55:32 twin4 mountd[3953]: /var/NFSv4/musicbox exported to both 192.168.1.0/24 and twin7.localdomain in 192.168.1.0/24,twin7.localdomain Feb 8 14:07:37 twin4 dhclient: DHCPREQUEST on eth0 to 192.168.1.1 port 67 Feb 8 14:07:37 twin4 dhclient: DHCPACK from 192.168.1.1 Feb 8 14:07:37 twin4 dhclient: bound to 192.168.1.4 -- renewal in 1771 seconds. Feb 8 14:09:56 twin4 smartd[3468]: Device: /dev/hda, SMART Prefailure Attribute: 8 Seek_Time_Performance changed from 237 to 236 Feb 8 14:10:37 twin4 mountd[3953]: /var/NFSv4/musicbox exported to both 192.168.1.0/24 and twin7.localdomain in 192.168.1.0/24,twin7.localdomain Feb 8 14:25:07 twin4 sshd(pam_unix)[29234]: session opened for user me by (uid=0) Feb 8 14:25:36 twin4 su(pam_unix)[29279]: session opened for user root by me(uid=500) |
با استفاده از گزینه –f فرمان tail مانیتور فایل را ادامه میدهد و زمانی که خطوط جدیدی اضافه گردد، بهصورت خودکار در لحظه نمایش داده میشوند. برای خروج از این حالت Ctrl+C را فشار دهید.