لینوکس مقدماتی/کار با فایلها متنی
مقدمه
[ویرایش]در این فصل روشهایی برای جستجو و استخراج اطلاعاتی از، فایلهای متنی مورد بررسی قرار میگیرد.
در عمل فایلهای متنی که ما آنها را جستجو میکنیم و اطلاعاتی را از آنها استخراج میکنیم. لاگهای سیستم هستند(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
توضیح مثال۶: سطرهایی از فایل متنی مذکور باید پیدا شوند که حاوی فقط حاوی یک کلمهٔ ۴ کاراکتری هستند.