computerhoteles
computerhoteles

آشنايي با كاربردهاي دستورات sed و awk

در دنياي آي تي مواقع زيادي برايمان پيش مي‌آيد كه مي بايست كارهاي تكراري را بارها و بارها انجام دهيم؛ در حين كار با فايل‌ها و محتويات آن‌ها نيز اين قضيه صادق است به طوري كه با استفاده از دستور sed و awk مي‌توان اين نوع كارها را مديريت كرد.

يك از ابزارهاي پردازش متن معروف، قديمي و كاربردي در سيستم عامل هاي مبتني بر يونيكس، sed نام دارد كه به منظور تغيير محتويات يك فايل به كار گرفته مي‌شود (نام اين دستور برگرفته از عبارت Stream Editor است.)

با استفاده از ابزار sed مي‌توان به فيلتر كردن متن و همچنين جايگزين كردن برخي واژگان به واژگاني ديگر پرداخت.
همان‌طور كه در تصوير فوق مشخص است، ديتاي مد نظر از Input Stream گرفته مي‌شود سپس عمليات مد نظر در فاز Working Stream روي ديتاي ورودي اعمال شده و در نهايت خروجي در Output Stream ذخيره مي‌شود.

جهت آشنايي بيشتر با كاربرد دستور sed، فايلي مي‌سازيم تحت عنوان file1 و عبارت This is sample text for file1 را وارد آن مي كنيم:

$ cat > file1
This is sample text for file1
$

حال دستور زير را اجرا مي كنيم:

$ sed s/is/are/ file1

به عنوان خروجي دستور فوق داريم:

Thare is sample text for file1

مي بينم كه واژه ي This به Thare تبديل شده است: به عبارت ديگر، اولين نمونه از عبارت is با are جايگزين شده است. حال با استفاده از دستور cat محتويات فايل file1 را مشاهده مي كنيم:

$ cat file1

به عنوان خروجي دستور فوق داريم:

This is sample text for file1

همان طور كه ملاحظه مي شود، محتويات فايل تغيير نكرده اند چرا كه ما خروجي دستور sed را ذخيره نكرديم. براي جايگزين كردن عبارت is با are به صورت Global (گلوبال يا سراسري)، از دستور زير استفاده مي كنيم:

$ sed s/is/are/g file1

به عنوان خروجي دستور فوق داريم:

Thare are sample text for file1

مي بينيم كه كليه ي واژگان is با are جايگزين شده اما كماكان تغييرات ذخيره نشده اند. براي ذخيره سازي تغييرات اعمال شده در فايل ديگري تحت عنوان file2، از دستور زير استفاده مي كنيم:

$ sed s/is/are/g file1 > file2

اكنون اگر محتويات فايل file2 را با استفاده از دستور cat مشاهده كنيم، مي بينيم كه تغييرات روي محتويات file1 اعمال شده سپس نسخه ي ويرايش شده در file2 ذخيره شده اند:

Thare are sample text for file1

آشنايي با كاربردهاي دستور awk
ابزار awk معمولاً براي گزارش گيري از فايل‌هاي مختلف مورد استفاده قرار مي‌گيرد. اين ابزار در Bell Labs در دهه ي ۱۹۷۰ ميلادي توسعه يافت و وجه تسميه ي آن برگرفته از نام توسعه دهندگانش Alfred Aho، Peter Weinberger، Brian Kernighan و  است. ابزار awk قابليت‌هاي بيشماري دارد كه از جمله ي مهم‌ترين آن‌ها مي‌توان به موارد زير اشاره كرد:
- يك ابزار قدرتمند و يك زبان برنامه نويسي تفسيري است.
- براي پردازش متن، تهيه ي گزارش و ارائه ي گزارش هاي اطلاعاتي به كار گرفته مي‌شود.

براي روشن‌تر شدن كاربرد ابزار awk ابتدا يك فايل جديد تحت عنوان testFile به صورت زير مي‌سازيم:

$ cat > testFile
password: 123456
username: bm
$

حال دستور زير را اجرا مي كنيم:

$ awk -F: '{print }' testFile

به عنوان خروجي دستور فوق داريم:

password
username

در تفسير خروجي بالا بايستي بگوييم كه آپشن F- اين امكان را به ما مي دهد تا يك «جدا كننده ي فيلد» در نظر بگيريم كه در اينجا : است. در واقع همان طور كه در ديتابيس ما فيلدهاي مختلفي براي يك جدول داريم، در لينوكس در فايل هاي متني با استفاده از جدا كننده هايي همچون علامت : مي توان فيلدهاي مد نظر خود را مشخص ساخت. در ادامه داخل علامت هاي  '{ }' دستور print را نوشته سپس 1$ را آورده ايم كه منظور آن است كه اولين فيلد (Column) در هر خط است.


آشنايي با دستورات پر كاربرد در ارتباط با فايل ها در لينوكس

لينوكس ابزارهاي متنوعي براي كار با فايل‌ها در اختيار كاربرانش قرار مي‌دهد كه از جمله ي مهم‌ترين آن‌ها مي‌توان به موارد زير اشاره كرد:
sort
uniq
paste
join
split

ابزار sort
sort را مي‌توان به منظور مرتب سازي خطوط يك فايل متني خواه از جديد به قديم و خواه از قديم به جديد مورد استفاده قرار داد. علاوه بر اين، با استفاده از اين دستور مي‌توان بر اساس فيلدهاي يك فايل نيز محتويات را مرتب سازي كرد.

به منظور درك بهتر عملكرد دستور sort، ابتدا يك فايل تحت عنوان tmp ساخته و چند خط محتوا داخل آن وارد مي سازيم. به عنوان خروجي اين فايل داريم:

line one
line two
line three
line four
line five
line six
line seven

حال دستور زير را روي اين فايل اعمال مي‌كنيم:

sort tmp

به عنوان خروجي دستور فوق داريم:

line five
line four
line one
line seven
line six
line three
line two

همان‌طور كه مشاهده مي‌شود، محتويات داخل اين فايل بر اساس حروف الفباي انگليسي از A تا Z مرتب شده‌اند؛ اگر هم بخواهيم كه ترتيب خطوط از Z به A باشد هم مي بايست دستور زير را اجرا كنيم:

sort -r tmp

به عنوان خروجي دستور فوق داريم:

line two
line three
line six
line seven
line one
line four
line five

مي‌بينيم كه آپشن r- كه از واژه ي Reverse به معني «برعكس» گرفته شده است كليه محتويات فايل را از Z به A مرتب مي‌سازد.
 نكته
در صورتي هم كه بخواهيم ۲ فايل مجزا را ابتدا با يكديگر ادغام نموده سپس آن‌ها را مرتب سازي كنيم، مي‌توانيم از دستور cat file1 file2 | sort استفاده نماييم.

دستور uniq
اين دستور براي حذف محتويات تكراري داخل يك فايل مورد استفاده قرار مي‌گيرد البته اين در حالي است كه خطوط تكراري حتماً مي بايست پشت سر هم قرار گرفته باشند.
براي روشن‌تر شدن كاربرد ابزار uniq در لينوكس، محتويات فايل tmp كه پيش از اين ساختيم را به صورت زير آپديت مي‌كنيم:

line one
line two
line one
line one

همان‌طور كه مشاهده مي‌شود، اگرچه كه خطوط اول، سوم و چهارم تكراري هستند، اما ابزار uniq صرفاً خطوط سوم و چهارم را تكراري تلقي مي‌كند و از همين روي خط چهارم را حذف مي‌كند. براي اين كار، دستور uniq tmp را در كامند لاين وارد مي‌كنيم؛ به عنوان خروجي دستور فوق داريم:

line one
line two
line one

با توجه به اين ويژگي دستور uniq، بهتر آن است كه ابتدا با استفاده از دستور sort خطوط را مرتب سازي كنيم تا خطوط تكراري پشت سر هم قرار گيرند سپس دستور uniq را با استفاده از علامت | اعمال كنيم. در همين راستا، ابتدا دستور sort tmp | uniq را در كامند لاين وارد مي سازيم. به عنوان خروجي اين دستور داريم:

line one
line two

به عنوان راه‌كاري جايگزين، مي‌توان با در نظر گرفتن آپشن u- در ابزار sort هر دو گام را در يك مرحله انجام داد:

sort -u tmp

به عنوان خروجي دستور فوق داريم:

line one
line two

مي‌بينيم كه هر دو دستور كار واحدي را انجام مي‌دهند. در صورتي هم كه بخواهيم تعداد خطوط تكراري را شمارش كنيم، مي‌توانيم از آپشن c- پس از كامند uniq به صورت زير استفاده كنيم:

uniq -c tmp

گاهي اوقات برايمان پيش مي‌آيد كه تمايل داريم خروجي دستور uniq را در فايل ديگري ذخيره سازيم؛ در چنين مواقعي ۲ راه‌كار پيش رو داريم:

sort file1 file2 | uniq > file3

و يا

sort -u file1 file2 > file3

در كامند اول ابتدا فايل‌هاي file1 و file2 را با يكديگر ادغام و مرتب نموده سپس دستور uniq را روي آن اعمال نموده و در نهايت خروجي را در فايل جديدي تحت عنوان file3 ذخيره مي‌سازيم. كامند دوم هم دقيقاً همين كار را انجام مي‌دهد اما به جاي اعمال دستور uniq از آپشن u- كامند sort استفاده مي‌كند.

آشنايي با دستور paste
فرض كنيم فايلي داريم كه حاوي نام و نام خانوادگي پرسنل يك شركت است و فايل ديگري حاوي شماره تلفن و شماره ي پرسنلي ايشان است؛ حال مي‌خواهيم فايلي داشته باشيم كه دربرگيرنده ي نام، نام خانوادگي، شماره تلفن و شماره ي پرسنلي باشد كه در چنين شرايطي دستور paste به سادگي اين كار را برايمان انجام خواهد داد.

همان‌طور كه در تصوير فوق مشخص است، براي مجزا سازي بخش‌هاي مختلف اطلاعات پرسنل از Space (اسپيس يا فضاي خالي) استفاده شده است و ابزار paste هم از همين فضاي خالي براي تشخيص ستون‌هاي مختلف استفاده خواهد كرد. براي روشن‌تر شدن كاربر دستور paste، ابتدا يك فايل تحت عنوان file1 با محتويات زير مي سازيم:

Steve Jobs
Bill Gates
Elon Musk

سپس فايل ديگري تحت عنوان file2 با محتويات زير مي‌سازيم:

Apple
Microsoft
SpaceX

حال دستور paste file1 file2 را در كامند لاين وارد مي‌كنيم؛ به عنوان خروجي اين دستور داريم:

Steve Jobs    Apple
Bill Gates    Microsoft
Elon Musk    SpaceX

مي‌بينيم كه خط اول از فايل file1 با خط اول از فايل file2 تطبيق داده شده الي آخر؛ حال اگر بخواهيم در حين ادغام ۲ فايل از «جدا كننده يي» استفاده كنيم، مي‌توانيم دستور زير را اجرا نماييم:

paste -d ':' file1 file2

به عنوان خروجي دستور فوق داريم:

Steve Jobs:Apple
Bill Gates:Microsoft
Elon Musk:SpaceX

آشنايي با دستور join
فرض كنيم فايلي داريم تحت عنوان file1 كه حاوي نام افراد به علاوه ي شماره تلفن ايشان است؛ فايل ديگري نيز داريم تحت عنوان file2 كه اين فايل هم حاوي شماره تلفن افراد است به علاوه ي شهر محل سكونت ايشان.

چيزي كه در اين ۲ فايل تكراري است، شماره تلفن افراد است؛ حال ممكن است شرايطي برايمان پيش بيايد كه نياز داشته باشيم هر ۲ فايل را با يكديگر ادغام نموده اما ستون‌هاي تكراري حذف شوند كه در چنين شرايطي مي بايست از ابزاري تحت عنوان join استفاده نمود (دستور join نسخه ي پيشرفته يي از دستور paste است.)

عملكرد دستور join به اين شكل است كه ابتدا هر ۲ فايل را مورد بررسي قرار مي‌دهد تا ببيند كه آيا داراي ستون مشتركي هستند يا خير؛ سپس هر ۲ فايل را بر اساس ستوني كه در هر دو فايل وجود دارد به يكديگر الحاق مي‌كند. براي روشن‌تر شدن اين مسئله، ابتدا فايلي مي‌سازيم تحت عنوان file1 كه داراي محتويات زير است:

07 Mohammad
14 Behzad
112 Siamak

سپس فايلي مي‌سازيم تحت عنوان file2 كه داراي محتويات زير است:

07 Tehran
14 Arak
112 Ahvaz

همان‌طور كه مي‌بينيم، فيلد شناسه در هر دو فايل يكسان است. حال دستور join file1 file2 را در ترمينال وارد مي سازيم:

07 Mohammad Tehran
14 Behzad Arak
112 Siamak Ahvaz

مي‌بينم كه هر ۲ فايل با يكديگر ادغام شدند بدون آن كه فيلد شناسه ۲ بار تكرار شود.

آشنايي با دستور split
ابزار split همان‌طور كه از نامش پيدا است -split به معناي مجزا ساختن است- براي تقسيم‌بندي يك فايل به بخش‌هاي مساوي به منظور سهولت بيشتر كار كردن با آن فايل مورد استفاده قرار مي‌گيرد و معمولاً از اين دستور براي كار با فايل‌هاي خيلي حجيم استفاده مي‌شود.


به صورت پيش‌فرض، كامند split يك فايل حجيم را به بخش‌هاي ۱۰۰۰ خطي تقسيم‌بندي مي‌كند و اين در حالي است كه فايل اورجينال يا اصلي بدون تغيير باقي خواهد ماند اما فايل‌هايي ۱۰۰۰ خطي با همان نام + يك پيشوند ساخته خواهند شد كه اين پيشوند به صورت پيش‌فرض حرف x است.

فرض كنيم فايلي داريم تحت عنوان american-persian كه يك فايل ديكشنري است كه چندين هزار خط محتويات دارد. با استفاده از دستور زير، قادر خواهيم بود تا اين فايل را به بخش‌هاي ۱۰۰۰ خطي مجزا از يكديگر در قالب فايل‌هايي تحت عنوان dictionay تقسيم‌بندي خواهد كرد:

$ split american-english dictionary

آشنايي با دستور wc
wc برگرفته از كلمات Word Count به معني «تعداد كلمه» است و كاري كه اين دستور انجام مي‌دهد اين است كه به صورت پيش‌فرض تعداد خطوط، لغات و كاراكترهاي قرار گرفته در يك فايل متني را در معرض ديدمان قرار مي‌دهد. در صورتي كه بخواهيم رفتار پيش‌فرض wc را تغيير دهيم، مي‌توانيم از آپشن l- براي نمايش فقط تعداد خطوط، از آپشن c- براي نمايش فقط تعداد كاراكترها و از آپشن w- فقط براي تعداد كلمات استفاده كنيم.

براي روشن‌تر شدن كاربرد دستور wc ابتدا فايلي تحت عنوان tmp ساخته سپس محتوايي دلخواه داخل آن مي‌ريزيم:

This is some dummy text.

حال دستور wc tmp را اجرا مي‌كنيم؛ به عنوان خروجي اين دستور داريم:

1  5 25 tmp

براي آن كه صرفاً تعداد كلمات را نشان دهيم، دستور wc -w tmp را در ترمينال وارد مي‌كنيم؛ به عنوان خروجي اين دستور داريم:

5 tmp

ادامهـ مطلبـ
| ۱۱ تير ۱۳۹۶ | ۰۱:۴۶:۴۳ | computerhoteles
،
ارسال نظر
نام :
ایمیل :
سایت :
پیام :
خصوصی :
کد امنیتی :

آخرین مطالب ارسالی

سرویس وبلاگدهی فارسی یا پارسی رایگان