مقدمه
در فصل گذشته با مفاهیم قدرتمند Redirection و Piping آشنا شدیم و دیدیم که چگونه میتوانیم جریان
داده را بین دستورات و فایلها هدایت کنیم. اکنون آمادهایم تا وارد مبحث جذاب «آنالیز و دستکاری
فایلها» شویم. در بسیاری از موارد، ما به کل محتوای یک فایل نیاز نداریم، بلکه به دنبال اطلاعات یا
آمار خاصی از آن هستیم.
این فصل را با یادگیری ابزارهایی شروع میکنیم که برای استخراج اطلاعات از فایلها طراحی شدهاند.
ما یاد میگیریم چگونه آمار یک فایل متنی (تعداد خطوط، کلمات و کاراکترها) را به دست آوریم، چگونه
در محتوای فایلها به دنبال الگوهای خاصی بگردیم و چگونه به متادیتای کامل و جامعی از یک فایل
دسترسی پیدا کنیم. ابزارهایی که در این درس با آنها آشنا میشویم، یعنی wc، grep و
stat، جزو پرکاربردترین دستورات هر مدیر سیستم یا توسعهدهندهای هستند.
شمارش کلمات، خطوط و کاراکترها با wc
دستور wc (مخفف Word Count) یک ابزار ساده و در عین حال بسیار کاربردی برای
شمارش است. این دستور میتواند تعداد خطوط، کلمات و بایتهای یک فایل یا ورودی استاندارد را شمارش
کند. اگر آن را به تنهایی روی یک فایل اجرا کنیم، سه عدد به ما میدهد:
$ wc /etc/passwd
47 95 2459 /etc/passwd
خروجی بالا به ترتیب به این معناست: فایل /etc/passwd دارای ۴۷ خط، ۹۵ کلمه و ۲۴۵۹ بایت
(کاراکتر) است.
گزینههای پرکاربرد wc
معمولاً ما فقط به یکی از این آمارها نیاز داریم. wc گزینههایی دارد که به ما اجازه
میدهد فقط اطلاعات مورد نظر خود را استخراج کنیم.
آپشن |
توضیح |
-l |
فقط تعداد خطوط (lines) را میشمارد. |
-w |
فقط تعداد کلمات (words) را میشمارد. |
-c |
فقط تعداد بایتها (characters/bytes) را میشمارد. |
قدرت واقعی wc زمانی مشخص میشود که در یک زنجیرهی پایپ به عنوان فیلتر استفاده شود.
برای مثال، برای شمارش تعداد کاربران سیستم:
$ cat /etc/passwd | wc -l
47
جستجو در محتوای فایلها با grep
دستور grep (مخفف Global Regular Expression Print) بدون شک یکی
از مهمترین و پراستفادهترین ابزارهای خط فرمان لینوکس است. وظیفهی اصلی grep جستجوی
یک الگوی متنی (pattern) در ورودی و چاپ کردن تمام خطوطی است که حاوی آن الگو هستند. این ابزار برای
پیدا کردن اطلاعات خاص در فایلهای حجیم مانند فایلهای گزارش (Log) یا فایلهای پیکربندی، حیاتی
است.
ساختار اصلی آن به شکل grep "pattern" filename است. برای مثال، برای پیدا کردن خط مربوط
به کاربر root در فایل /etc/passwd:
$ grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:37:37:Operator,,,:/root:/bin/sh
گزینههای مفید grep
دستور grep گزینههای بسیار زیادی برای کنترل جستجو دارد که در اینجا به چند مورد از
مهمترین آنها اشاره میکنیم.
آپشن |
توضیح |
-i |
جستجوی غیر حساس به بزرگی و کوچکی حروف (case-insensitive). |
-v |
جستجوی معکوس (invert). تمام خطوطی را چاپ میکند که با الگو مطابقت ندارند.
|
-c |
فقط تعداد خطوطی که مطابقت دارند را میشمارد (count). |
-n |
شماره خط (number) را در ابتدای هر خط خروجی نمایش میدهد. |
-r یا -R |
به صورت بازگشتی (recursive) در تمام فایلهای یک دایرکتوری و زیرشاخههای آن جستجو
میکند. |
یک کاربرد بسیار رایج grep -v، فیلتر کردن خطوط کامنت (که با # شروع میشوند)
از فایلهای پیکربندی است تا فقط تنظیمات فعال نمایش داده شوند:
$ grep -v "#" /etc/some_config.conf
بررسی متادیتای کامل فایل با stat
دستور ls -l اطلاعات مفیدی در مورد فایلها به ما میدهد، اما گاهی به جزئیات بسیار
بیشتری نیاز داریم. دستور stat (مخفف status) متادیتای کاملی که سیستم فایل در مورد
یک فایل یا دایرکتوری ذخیره کرده است را به ما نشان میدهد.
$ stat .bashrc
File: .bashrc
Size: 3771 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 1192791 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ me) Gid: ( 1000/ me)
Access: 2025-07-20 10:30:00.000000000 -0400
Modify: 2025-07-15 11:25:00.000000000 -0400
Change: 2025-07-15 11:25:01.000000000 -0400
Birth: -
این خروجی اطلاعات بسیار ارزشمندی را در بر دارد:
- Size و Blocks: سایز واقعی فایل و مقدار فضایی که روی دیسک اشغال کرده است.
- Inode: شماره شناسایی منحصربهفرد فایل در سیستم فایل.
- Links: تعداد هاردلینکهای اشارهکننده به این فایل.
- Access/Uid/Gid: اطلاعات کامل دسترسیها، شناسهی کاربر و گروه مالک.
- Access/Modify/Change: سه برچسب زمانی مهم. Access آخرین باری که فایل خوانده
شده، Modify آخرین باری که محتوای فایل تغییر کرده و Change آخرین باری که
متادیتای فایل (مثل دسترسیها) تغییر کرده است را نشان میدهد.