لینوکس مقدماتی/کار با فایل‌ها متنی

ویکی‎کتاب، کتابخانهٔ آزاد

مقدمه[ویرایش]

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

در عمل فایل‌های متنی که ما آن‌ها را جستجو می‌کنیم و اطلاعاتی را از آن‌ها استخراج می‌کنیم. لاگ‌های سیستم‌ هستند(system log) که حاوی اطلاعات گوناگون در مورد سیستم هستند مثلا اگر سیستم crash کند و با مشکل روبرو شود با رجوع به چنین فایل‌هایی می‌توان دلیل این مشکل را فهمید.

بعضی از فایل‌های لاگ مهم:

مثلا فایل لاگ سرورها مثلا فایل لاگ سرور دیتابیس mysql یا فایل لاگ وب سرور apache و ...

در مثال‌های زیر فرض کنید که فایل‌های زیر را در دیرکتوری فعلی داریم:

This is a file
This is not a pdf
This file is not a pdf

cat[ویرایش]

ساختار[ویرایش]

cat [path]

[path] مسیر فایلی است که میخواهیم بخوانیم.

توضیح[ویرایش]

از این دستور صرفا برای مشاهدهٔ محتویات فایل‌های متنی با حجم کم استفاده میشود.

مثال[ویرایش]

مثال۱[ویرایش]

user1@sadegh-VirtualBox:~/Desktop/arch_dir/files/text_files$ cat file1.txt

خروجی:

This is a file
This is not a pdf
This file is not a pdf

less[ویرایش]

ساختار[ویرایش]

less [path]

[path] مسیر فایلی است که میخواهیم بخوانیم.

توضیح[ویرایش]

از این دستور برای خواندن فایل‌های متنی حجیم(فایل‌هایی که تعداد خطوط و کلمات در آن زیاد است) استفاده می‌شود.

پس از زدن دستور فوق از کلید‌های زیر میتوان برای جستجو و بررسی متن استفاده کرد:

  • / برای جستجو کردن:‌ برای جستجو کردن ابتدا / را میزنیم بعد عبارت یا Regex مد نظر خود را می‌نویسیم. برنامهٔ less عبارت مورد جستجو را برای ما پیدا می‌کند و تمام رخدادهای(occurrence) عبارت مورد جستجو در متن را مشخص میکند(یعنی مثلا اگر ۲۰ بار در متن کلمهٔ test تکرار شده باشد هر ۲۰ رخداد این کلمه در متن مشخص می‌شود) با زدن کلید n میتوان به رخداد بعدی آن عبارت یا کلمه برویم. با زدن کلید shift + n میتوانیم به رخداد قبلی آن عبارت یا کلمه برویم.
  • با کلید‌های بالا و پایین روی کیبورد یا کلید‌های j و k میتوانیم در متن بالا و پایین برویم و تمام متن را ببینیم. با زدن کلید بالا یا k یک خط به جلو میرویم و با زدن کلید پایین یا j یک خط به عقب می‌رویم.
  • با زدن کلید‌ g به ابتدای فایل میرویم و با زدن کلید shift + g به انتهای فایل میرویم.
  • با زدن کلید ctrl + f یک پنجره به جلو می‌رویم.
  • با زدن کلید ctrl + b یک پنجره به عقب می‌رویم.
  • با زدن کلید q از برنامه خارج می‌شویم.

مثال[ویرایش]

مثال۱[ویرایش]

user1@sadegh-VirtualBox:~/Desktop/arch_dir/files/text_files$ less file1.txt

tail/head[ویرایش]

ساختار[ویرایش]

tail [path]

head [path]

[path] : مسیر فایلی که میخواهیم آن را بخوانیم.

پرچم مهم:

-n بعد از این پرچم تعداد خط ‌هایی از فایل را که میخواهیم ببینیم را مشخص میکنیم. مثلا tail -n 20

-f برای دنبال کردن فایل استفاده می‌شود به این معنا که اگر فایل آپدیت شود، این آپدیت جدید به کاربر نشان داده ‌خواهد شد(تا زمانی که کاربر بخواهد).

توضیح[ویرایش]

tail برای مشاهدهٔ خطوط آخر از یک فایل استفاده می‌شود. به طور پیش‌فرض ۱۰ خط آخر فایل متن نمایش داده می‌شود.

head برای مشاهدهٔ خطوط اول یک فایل استفاده می‌شود. به طور پیش‌فرض ۱۰ خط اول فایل متنی نمایش داده ‌می‌شود.

مثال[ویرایش]

مثال۱[ویرایش]

user1@sadegh-VirtualBox:~/Desktop/arch_dir/files/text_files$ tail file1.txt

دستور بالا ۱۰ خط آخر فایل file1.txt را نشان می‌دهد.

مثال۲[ویرایش]

user1@sadegh-VirtualBox:~/Desktop/arch_dir/files/text_files$ tail -n 20 file1.txt

دستور بالا ۲۰ خط آخر فایل file1.txt را نمایش می‌دهد.

مثال۳[ویرایش]

user1@sadegh-VirtualBox:~/Desktop/arch_dir/files/text_files$ tail -f file1.txt

دستور بالا کاربرد پرچم -f را نشان می‌دهد. این پرچم برای دیباگ کردن بسیار کاربرد دارد. مخصوصا برای برنامه نویسان که در لینوکس برنامه نویسی میکنند مثلا میتوان فایل لاگ سرور mysql را با این پرچم tail کنیم و سپس برنامهٔ خود را که با سرور mysql کار می‌کند اجرا کنیم در صورتی که برنامهٔ ما هنگام کار کردن با دیتابیس دچار مشکل شد می‌توانیم در لحظه فایل لاگ را بررسی کنیم.

find[ویرایش]

ساختار[ویرایش]

find [path][flags]

همانطور که می‌بینید در این دستور بر خلاف دستورهای دیگری که تا به حال بررسی کردیم آرگون قبل از پرچم‌ها قرار می‌گیرند.

پرچم‌های مهم:

-type از این پرچم برای مشخص کردن نوع چیزی که به دنبال آن هستیم استفاده‌ می‌کنیم:

-type f یعنی فقط به دنبال فایل هستیم.

-type d یعنی فقط به دنبال دیرکتوری هستیم.

-name از این پرچم برای مشخص کردن نام فایلی که به دنبال آن هستیم استفاده می‌کنیم

-name "file_name" نام فایل( یا regex) را جلوی پرچم می‌نویسیم

مثلا -name "*.php" تمام فایل‌هایی که پسوند آنها php‌ است را پیدا می‌کند.

توضیح[ویرایش]

از این دستور برای جستجوی فایل‌ها و دیرکتوری‌ها استفاده می‌شود.

مثال[ویرایش]

مثال۱[ویرایش]

user1@sadegh-VirtualBox:~/Desktop$ find /home/user1/Desktop/files

دستور بالا تمام فایل‌ها و دیرکتوری‌هایی که در /home/user1/Desktop/files وجود دارند را لیست می‌کند. خروجی:‌

/home/user1/Desktop/files
/home/user1/Desktop/files/dir3
/home/user1/Desktop/files/dir1
/home/user1/Desktop/files/dir2
/home/user1/Desktop/files/text_files
/home/user1/Desktop/files/text_files/file1.txt
/home/user1/Desktop/files/text_files/file2.txt
/home/user1/Desktop/files/text_files/file3.txt

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

مثال۲[ویرایش]

user1@sadegh-VirtualBox:~/Desktop/arch_dir/files$ find /home/user1/Desktop/files -type f

دستور بالا فقط تمام فایل‌ها را در دیرکتوری /home/user1/Desktop/files لیست می‌کند.(دیرکتوری‌ها را لیست نمی‌کند.) چرا که مشخص کرده‌ایم که

-type f یعنی فقط فایل‌ها را نشان بده.

مثال۳[ویرایش]

user1@sadegh-VirtualBox:~/Desktop/arch_dir/files$ find /home/user1/Desktop/files/ -type d

دستور بالا فقط تمام دیرکتوری‌ها را در دیرکتوری /home/user1/Desktop/files نشان می‌دهد خروجی :

/home/user1/Desktop/files/
/home/user1/Desktop/files/dir3
/home/user1/Desktop/files/dir1
/home/user1/Desktop/files/dir2
/home/user1/Desktop/files/text_files

مثال از پرچم -name :

مثال۴[ویرایش]

user1@sadegh-VirtualBox:~/Desktop/arch_dir/files$ find . -name "file1.txt"

دستور بالا تمام فایل‌ها و یا دیرکتوری ها با نام file1.txt را پیدا می‌کند خروجی:

./text_files/file1.txt
./text_files/test/file1.txt

مثال۵[ویرایش]

user1@sadegh-VirtualBox:~/Desktop/arch_dir/files$ find text_files/ -name "*.txt"

دستور بالا تمام فایل‌هایی که پسوند آن‌ها .txt است را لیست می‌کند(در اینجا از عملیات globbing استفاده کردیم) خروجی:

text_files/file1.txt
text_files/file2.txt
text_files/file3.txt
text_files/test/file1.txt
text_files/test/file2.txt
text_files/test/file3.txt

grep[ویرایش]

ساختار[ویرایش]

grep [string] [path]

[string] عبارت مورد جستجو

[path] فایلی که میخواهیم عبارت را در آن جستجو کنیم(میتوان نام چند فایل را با فاصله نوشت)

توضیح[ویرایش]

این دستور از دستورات پر کاربرد است. برای پیدا کردن خط شامل یک عبارت (کلمه یا جمله یا عباراتی که با الگوی یک عبارت منظم (Regex) مطابقت دارند) استفاده می‌شود.

نکته: این دستور بیشتر با عملگر پایپ (pipe) یعنی | استفاده می‌شود. یعنی به جای اینکه مسیر فایل مشخص شود خروجی دستور قبلی یا به عبارت صحیح‌تر STDOUT به عنوان فایلی که باید در آن جستجو انجام شود به grep داده می‌شود. به مثال ۴در زیر دقت کنید.

مثال[ویرایش]

مثال۱[ویرایش]

user1@sadegh-VirtualBox:~/Desktop/arch_dir/files$ grep "to ancient" text_files/file3.txt

مثال۲[ویرایش]

user1@sadegh-VirtualBox:~/Desktop/arch_dir/files$ grep "this" text_files/file1.txt text_files/file2.txt text_files/file3.txt

مثال۳[ویرایش]

user1@sadegh-VirtualBox:~/Desktop/arch_dir/files$ grep "this" text_files/*

مثال۴[ویرایش]

user1@sadegh-VirtualBox:~/Desktop/arch_dir/files$ cat text_files/file3.txt  | grep "this"

توضیح: همانطور که در مثال ۴ می‌بینید دو دستور با یک خط | از هم جدا شده‌اند. خروجی دستور اول یعنی (cat text_files/file3.txt) به عنوان ورودی به دستور بعدی یعنی grep "this" داده می‌شود.

مثال۵[ویرایش]

user1@sadegh-VirtualBox:~/Desktop/arch_dir/files/text_files$ cat file1.txt  | grep "file" | grep "This"

مثال۶[ویرایش]

user1@sadegh-VirtualBox:~/Desktop/arch_dir/files/text_files$ find . -type f | grep "file"

توضیح: در مثال۶ خروجی دستور اول لیست نام تمام فایل‌های درون دیرکتوری فعلی (.) است و این خروجی به عنوان ورودی به دستور grep داده می‌شود. بنابراین در کل مجموع این دو دستور تمامی فایل‌هایی که در نامشان رشتهٔ file وجود دارد لیست می‌شودند.

sort[ویرایش]

ساختار[ویرایش]

توضیح[ویرایش]

از این دستور برای مرتب سازی فایل‌ها متنی استفاده می‌شود. به اینصورت که سطرهای فایل متنی مرتب می‌شوند.

مثال[ویرایش]

برای مثال می‌خواهیم فایل زیر را مرتب کنیم.

apple cat
monkey animal wild zebra
black warm worm 
This abfd
This abcd
1
2
3
10
31
2

مثال۱

user1@sadegh-VirtualBox:~/Desktop/arch_dir/files/text_files$ sort file4.txt

خروجی

1
10
2
2
3
31
apple cat
black warm worm 
monkey animal wild zebra
This abcd
This abfd

با توجه به خروجی مثال۱ باید به دو نکته توجه کنیم:‌

۱. از آنجا به طور پیش‌فرض دستور sort مرتب‌سازی را بر اساس حروف الفبا انجام می‌دهد به همین دلیل است که ۱۰ قبل از ۲ و ۳ در خروجی چاپ شده است.

۲. در دو خط آخر از آنجا که کلمهٔ اول هر دو خط This‌ می‌باشد و دو حرف اول کلمهٔ بعدی ab می‌باشد مرتب سازی برای این دو سطر بر اساس حرف سوم کلمهٔ‌ دوم آن‌ها (c و f) انجام می‌شود.

مثال۲

user1@sadegh-VirtualBox:~/Desktop/arch_dir/files/text_files$ sort -n file4.txt

خروجی

apple cat
black warm worm 
monkey animal wild zebra
This abcd
This abfd
1
2
2
3
10
31

همانطور که می‌بینم اعداد به درستی مرتب شده‌اند چرا که از پرچم -n استفاده کردیم. این پرچم باعث می‌شود تا اعداد نیز به درستی مرتب شوند.

cut[ویرایش]

ساختار[ویرایش]

cut [flags][path]

پرچم‌ها[ویرایش]

-c

c حرف اول کلمهٔ column است از پرچم بالا به این صورت استفاده می‌شود -c n1-n2 که n1 و n2 هر دو عدد هستند. و این به این معناست که کاراکتر n1 ام تا کاراکتر n2 ام از هر سطر را می‌خواهیم.

نکته:‌ اگر به جای n2 چیزی نگذاریم (-c n1-)یعنی از ستون یا همان کاراکتر n1 ام تا آخرین ستون از هر سطر را می‌خواهیم.

نکته: اگر فقط n1 را بنویسیم (-c n1) یعنی n1 امین ستون یا همان کاراکتر از هر سطر را می‌خواهیم.

-d و -f

d حرف اول کلمهٔ delimiter است(به معنای جداکننده) و f حرف اول کلمهٔ field است. این دو پرچم همراه با هم استفاده می‌شوند.

از پرچم -f مثل پرچم -c استفاده می‌شود.

با استفاده از پرچم -d به صورت مقابل delimiter را مشخص می‌کنیم و برنامه cut فایل متنی را بر اساس delimiter جداسازی می‌کند. delimiter ممکن است فاصله باشد یا , یا - یا هر چیز دیگر

ما به اینصورت delimiter را مشخص می‌کنیم: cut -d " "

پرچم -f مثل -c استفاده می‌شود. و منظور از field رشته‌هایی است که توسط delimiter از هم جدا می‌شوند مثلا اگر یک نوشتهٔ معمولی داشته باشیم(مثلا قسمتی از یک کتاب) و delimiter را کاراکتر فاصله در نظر بگیریم آنگاه هر کلمه یک field میشود.

توضیح[ویرایش]

از این دستور برای استخراج قسمتی از یک متن (مثلا ۲۰ کاراکتر آخر از هر سطر یک متن) استفاده می‌شود.

مثال[ویرایش]

برای مثال‌های زیر فرض کنید که فایل متنی زیر را داریم:

This is a file
This is not a pdf
This file is not a pdf

دستور cut هر فایل متنی را به صورت جدولی در نظر میگیرد، هر حرف از فایل متنی در یک خانه از جدول قرار می‌گیرد،جدول زیر را در نظر بگیرید:

22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
e l i f a s i s i h T
f d p a t o n s i s i h T
f d p a t o n s i e l i f s i h T

همانطور که می‌بیند سطر اول با احتساب فاصله‌های میان کلمات از ۱۴ ستون (۱۴ کاراکتر) تشکیل شده و سطر دوم از ۱۷ و سطر سوم از ۲۲ ستون تشکیل شده است.

مثال۱

cut -c 1-4 file1.txt

خروجی

This
This
This

توضیح: در مثال۱ ستون ۱ تا ۴ از فایل متنی برای تمامی سطر‌های آن فایل متنی به عنوان خروجی برگردانده می‌شود. مثال۲

cut -c 6- file1.txt

خروجی

is a file
is not a pdf
file is not a pdf

در مثال۲ از ستون ۶ام تا آخرین ستون هر سطر به عنوان خروجی نمایش داده ‌می‌شود. مثال۳

cut -c 6 file1.txt

خروجی

i
i
f

در مثال۳، ۶‌امین ستون از هر سطر به عنوان خروجی نمایش داده‌ می‌شود. مثال۴

cut -c 2,3,6 file1.txt

خروجی

hii
hii
hif

در مثال۴ کاراکتر‌های ۲ و ۳ و ۶ از هر فایل را به عنوان خروجی نمایش می‌دهیم. مثال۵

cut -d " " -f 2 file1.txt

خروجی

is
is
file

در مثال بالا delimiter را کاراکتر فاصله در نظر گرفته‌ایم بنابراین کلمات از نگاه برنامه فیلد هستند. و در ادامهٔ دستور فیلد دوم خواسته شده.

بنابراین فیلد دوم (کلمهٔ دوم ) از هر سطر بر گردانده می‌شود.

مثال۶

cut -d " " -f 1,3 file1.txt

خروجی

This a
This not
This is

مثال۷

cut -d " " -f 2-4 file1.txt

خروجی

is a file
is not a
file is not

مثال۸

cut -d " " -f 2- file1.txt

خروجی

is a file
is not a pdf
file is not a pdf

به فایل متنی زیر دقت کنید:

apple,orange,video,music
jam,    sand, ball,lemonade
james,jack,london

مثال۹

cut -d , -f 2 file6.txt

خروجی

orange
    sand
jack

به فاصله‌های پیش از کلمهٔ sand در خروجی و در متن اصلی دقت کنید.

wc[ویرایش]

ساختار[ویرایش]

wc [path]

پرچم‌ها[ویرایش]

-n

سطرهای حاوی اعداد نیز به درستی مرتب شوند(بر اساس ارزش عددی و نه بر اساس ارزش کارکتری)

-r

کاربرد آن زمانی است که بخواهیم مرتب‌سازی را برعکس کنیم (یعنی اگر صعودی است آن‌ را نزولی کنیم)

پرچم‌ها[ویرایش]

-w

تعداد کلمه‌ها

-c

تعداد کاراکتر‌ها

توضیح[ویرایش]

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

مثال[ویرایش]

مثال۱[ویرایش]

user1@sadegh-VirtualBox:~/Desktop/arch_dir/files/text_files$ wc file1.txt

خروجی

 3 15 56 file1.txt

در خروجی بالا

۳ تعداد خطوط فایل

۱۵ تعداد کلمات

۵۶ تعداد حروف

file.txt نام فایل

Regex(^ و $ و .)[ویرایش]

ساختار[ویرایش]

توضیح[ویرایش]

^ نمادی است به معنای ابتدای سطر

$ نمادی است به معنای انتهای سطر

. نمادی است به معنای یک کاراکتر (هر کاراکتری)

مثال[ویرایش]

برای مثال‌های زیر فایل متنی زیر را در نظر بگیرید:

This is a file
This is not a pdf
This file is not a pdf
This

مثال۱

grep "pdf$" file1.txt

خروجی

This is not a pdf
This file is not a pdf

توضیح مثال۱: سطر‌هایی از فایل متنی مذکور گرفته می‌شوند که آخرین کلمهٔ آن سه حرف pdf باشند.

مثال۲

grep "^This" file1.txt

خروجی

This is a file
This is not a pdf
This file is not a pdf
This

توضیح مثال۲: سطرهایی از فایل متنی مذکور گرفته می‌شوند که اولین کلمهٔ آن‌ها ۴ کاراکتر This باشد.

مثال۳

grep "f..e" file1.txt

خروجی

This is a file
This file is not a pdf

توضیح مثال۳: سطرهایی از فایل متنی مذکور گرفته می‌شود، در آن کلمه‌ای وجود داشت باشد با این الگو که چهار کاراکتر داشته باشد و کاراکتر اول آن f و کاراکتر آخر آن e باشد و دو کاراکتر وسط هر کاراکتری می‌توانند باشند.

مثال۴

grep " ...$" file1.txt

خروجی

This is not a pdf
This file is not a pdf

توضیح مثال۴: سطر‌هایی از فایل متنی مذکور پیدا می‌شوند که در آن کلمه‌ای وجود داشته باشد که با این الگو مطابقت داشته باشد: یک کلمهٔ ۴ کاراکتری که کاراکتری اول آن کاراکتر فاصله باشد و سه بعد از آن سه کاراکتر که هر کاراکتری ممکن است باشند و باید این کلمه آخرین کملهٔ آن سطر باشد.

مثال۵

grep "^....$" file1.txt

خروجی

This

توضیح مثال۶: سطرهایی از فایل متنی مذکور باید پیدا شوند که حاوی فقط حاوی یک کلمهٔ ۴ کاراکتری هستند.