لینوکس مقدماتی/کار با فایلها متنی
مقدمه
در این فصل روشهایی برای جستجو و استخراج اطلاعاتی از، فایلهای متنی مورد بررسی قرار میگیرد.
در عمل فایلهای متنی که ما آنها را جستجو میکنیم و اطلاعاتی را از آنها استخراج میکنیم. لاگهای سیستم هستند(system log) که حاوی اطلاعات گوناگون در مورد سیستم هستند مثلا اگر سیستم crash کند و با مشکل روبرو شود با رجوع به چنین فایلهایی میتوان دلیل این مشکل را فهمید.
بعضی از فایلهای لاگ مهم:
مثلا فایل لاگ سرورها مثلا فایل لاگ سرور دیتابیس mysql یا فایل لاگ وب سرور apache و ...
در مثالهای زیر فرض کنید که فایلهای زیر را در دیرکتوری فعلی داریم:
This is a file
This is not a pdf
This file is not a pdfcat
ساختار
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 pdfless
ساختار
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.txttail/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.txtgrep
ساختار
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توضیح مثال۶: سطرهایی از فایل متنی مذکور باید پیدا شوند که حاوی فقط حاوی یک کلمهٔ ۴ کاراکتری هستند.