مقدمه

در فصل گذشته با مفاهیم قدرتمند 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 آخرین باری که متادیتای فایل (مثل دسترسی‌ها) تغییر کرده است را نشان می‌دهد.