خواندن و جستوجوی متن در ترمینال
در این درس ۲ بخش
فرض کنید مسئول بررسی گزارش یک وبسایت آموزشی هستید و کسی گفته صفحهٔ درس لینوکس چند بار خطا داده است. لازم نیست برای پیدا کردن دو خط مهم، کل گزارش را در ویرایشگر باز کنید. در این درس با head ابتدا، با tail انتها، با less متن قابل پیمایش و با grep سطرهای مرتبط را میبینید. هدف فقط پیدا کردن کلمه نیست؛ باید بدانید چه بخشی از داده را دیدهاید و چه بخشی هنوز بررسی نشده است. مثالها در Debian یا Ubuntu و Bash اجرا میشوند.
برای اینکه هیچ گزارش واقعی تغییر نکند، پوشهای یکتا در خانهٔ خودتان و یک گزارش ساختگی میسازیم. دو خط اول الگوی ساخت آزمایشگاه هستند؛ بخش تصادفی نام ثابت نیست. اگر mktemp یا cd خطا داد، ادامه ندهید. دستور printf هر عبارت نقلشده را در یک سطر مینویسد. زمان، سطح پیام و موضوع هر رخداد جدا شدهاند تا انتخاب ابزار معنی داشته باشد. همهٔ هشت خط را وارد کنید؛ شمارهسطرهای پاسخها بر اساس همین ترتیب هستند و فاصلههای داخل هر سطر بخشی از دادهاند.
lab=$(mktemp -d "$HOME/darsavand-text.XXXXXX")
cd "$lab"
printf '%s\n' \
'09:00 INFO course=linux user=guest opened' \
'09:02 WARN course=linux slow-page' \
'09:03 ERROR course=linux missing-file' \
'09:04 INFO course=git opened' \
'09:05 ERROR course=linux timeout' \
'09:06 INFO course=linux recovered' \
'09:07 WARN course=git slow-page' \
'09:08 INFO course=linux finished' > requests.logبرای نگاه اول از head استفاده کنید. گزینهٔ -n 3 یعنی فقط سه سطر اول؛ tail با -n 2 دو سطر آخر را میدهد. این دو فرمان چیزی را ویرایش نمیکنند. بدون -n، هر کدام معمولاً ده سطر نمایش میدهند؛ بنابراین در این فایل کوچک، خروجی پیشفرضشان تمام فایل خواهد بود. head کمک میکند قالب گزارش را بشناسید و tail آخرین وضعیت ثبتشده را نشان میدهد. توجه کنید آخرین سطر لزوماً علت مشکل را توضیح نمیدهد؛ ممکن است فقط بازگشت وضعیت عادی را ثبت کرده باشد.
head -n 3 -- requests.log
tail -n 2 -- requests.logخروجی head باید از 09:00 شروع شود و به رخداد missing-file در 09:03 برسد. خروجی tail دو رخداد 09:07 و 09:08 است. اگر نتیجه متفاوت شد، قبل از تغییر فرمان تعداد و ترتیب خطهای نمونه را بررسی کنید. دقت در ورودی بخشی از کار با ترمینال است؛ ابزار درست روی دادهٔ اشتباه پاسخ قابل اعتماد نمیدهد. پسوند .log فقط قراردادی برای شناخت گزارش است؛ این فرمانها محتوای متن را میخوانند و وابسته به همین پسوند نیستند.
وقتی متن طولانیتر است، less نمایش را صفحهبهصفحه نگه میدارد و ترمینال را با همهٔ فایل پر نمیکند. دستور زیر را اجرا کنید؛ -N بزرگ شمارهٔ سطرها را کنار متن نشان میدهد. داخل less، فاصله به صفحهٔ بعد میرود، b به عقب برمیگردد، g ابتدای فایل و G انتهای فایل است. /ERROR و سپس Enter را بزنید تا جستوجو شود؛ n تطبیق بعدی را پیدا میکند و q بیرون میآید. این کلیدها را داخل نمایشگر میزنید، نه پس از برگشتن به اعلان Bash.
less -N -- requests.logبرای استخراج سطرهای مرتبط، grep را بهکار ببرید. -F الگو را متن معمولی میگیرد، پس فعلاً درگیر معنی ویژهٔ نشانههای عبارت منظم نمیشویم. -n کوچک شمارهٔ سطر را اضافه میکند. فرمان زیر باید دو سطر با پیشوندهای 3: و 5: بدهد: یکی missing-file و دیگری timeout. grep فقط سطرهای دارای الگو را انتخاب میکند؛ ترتیب سطرهای فایل را عوض نمیکند و متن اصلی را تغییر نمیدهد. وجود دو پیام ERROR به معنای دو رخداد ثبتشده است، نه اثبات اینکه دو علت مستقل داشتهایم.
grep -nF -- 'ERROR' requests.log
grep -niF -- 'error' requests.logحروف بزرگ و کوچک در جستوجوی پیشفرض متفاوتاند؛ جستوجوی error بدون -i در این داده نتیجهای ندارد، چون مقدارها ERROR هستند. -i این تفاوت را نادیده میگیرد و فرمان دوم همان دو سطر را پیدا میکند. نبودن خروجی همیشه خرابی ابزار نیست؛ شاید هیچ سطری مطابق نباشد. در مقابل، پیام No such file or directory به نام یا مسیر نادرست اشاره میکند. ابتدا نام requests.log و پوشهٔ جاری را بررسی کنید. میان جستوجوی نام فایل و جستوجوی متن داخل آن فرق بگذارید؛ grep اینجا دومی را انجام میدهد.
خروجی مورد انتظار هر دو جستوجوی بالا یکسان است؛ این کادر خروجی است و نباید اجرا شود:
3:09:03 ERROR course=linux missing-file
5:09:05 ERROR course=linux timeoutتمرین: هشدارها و آخرین وضعیت
دو بررسی جدا انجام دهید: نخست همهٔ سطرهای WARN را با شمارهٔ سطر پیدا کنید؛ سپس سه سطر آخر گزارش را ببینید. پیش از اجرا، شمارهٔ هشدارها و اولین زمان خروجی دوم را از روی داده حدس بزنید. پاسخ شما باید فقط به نمونهٔ این درس متکی باشد. اگر یکی از هشدارها دربارهٔ git بود، آن را حذف نکنید؛ خواستهٔ تمرین همهٔ هشدارهاست. این نکته یادآوری میکند که معنای سؤال، انتخاب الگوی جستوجو را تعیین میکند.
grep -nF -- 'WARN' requests.log
tail -n 3 -- requests.logپاسخ توضیحدار: grep باید سطرهای 2 و 7 را نشان دهد؛ هر دو WARN دارند، هرچند موضوعشان متفاوت است. tail از رخداد 09:06 شروع میکند و سه سطر تا 09:08 را میآورد. اگر فقط یک هشدار پیدا کردید، احتمالاً الگوی محدودتری نوشتهاید یا داده کامل نیست. اکنون باید بتوانید برای یک سؤال مشخص ابزار انتخاب کنید: شناخت قالب با head، بررسی پایان با tail، مرور تعاملی با less و انتخاب سطر با grep. در درس لوله و هدایت خروجی، همین ابزارها را از راه ورودی و خروجی به هم متصل میکنید.
منابع رسمی و مطالعهٔ تکمیلی
https://manpages.ubuntu.com/manpages/focal/man1/mktemp.1.html
https://www.gnu.org/s/coreutils/manual/html_node/head-invocation.html
https://www.gnu.org/s/coreutils/manual/html_node/tail-invocation.html
https://www.gnu.org/s/grep/manual/grep.html
https://manpages.ubuntu.com/manpages/resolute/man1/less.1.html
https://www.gnu.org/software/grep/manual/html_node/Matching-Control.html
تألیف و مثالهای اختصاصی: تحریریه درسآوند. منابع انگلیسی برای بررسی مفاهیم و مطالعهٔ تکمیلی معرفی شدهاند.
متن درسهای عمومی را بدون ورود بخوانید.