
در سیستم عامل لینوکس، بسیاری از تنظیمات برنامههای مختلف، در فایلهای متنی انجام میشوند. گاهی این فایلها دارای خطهای زیادی هستند. برای جستجو و ویرایش در فایلهای متنی، دستورات و برنامههای مختلفی، وجود دارند، که به آنها، دستورات پردازش متن(Text Processing) میگویند. پردازش متن، میتواند شامل تغییر یک کلمه، در سرتاسر متن و یا قسمتی از آن و جایگزینی با متن یا کلمهای دیگر باشد. جستجو در یک فایل متنی شامل هزاران کلمه، یکی دیگر از ضرورتهای کار با فایلهای متنی است. در ادامه با چندین دستور و برنامهی پرکاربرد، در پردازش متن در سیستم عامل لینوکس، آشنا میشوید:
دستورات پرکاربرد برای پردازش متن در لینوکس
دستور cat
با استفاده از دستور cat میتوانید محتوای یک فایل متنی را مشاهده نمایید. برای مثال با دستور cat محتوای فایلی به نام TextFile را مشاهده میکنید:
1 2 3 4 5 6 7 8 |
kazemian@upgradeit:~$ cat TextFile This is a test. This is a plain text. ... This file is text file. kazemian@upgradeit:~$ |
دستور head
با دستور head میتوانید، n خط اول یک فایل متنی را مشاهده نمایید. به طور پیشفرض تعداد ده خط اول یک فایل در نظر گرفته شده است. با آپشن n- میتوانیم تعداد خطوط نمایش را تعیین نماییم. در شکل زیر فایل syslog که یکی از فایلهایی است که رویدادهای سیستم، در آن ذخیره میشود را مشاهده مینمایید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
kazemian@upgradeit:~$ head /var/log/syslog Nov 11 17:41:44 upgradeit rsyslogd: [origin software="rsyslogd" swVersion="8.2001.0" x-pid="673" x-info="https://www.rsyslog.com"] rsyslogd was HUPed Nov 11 17:41:44 upgradeit systemd-resolved[593]: Server returned error NXDOMAIN, mitigating potential DNS violation DVE-2018-0001, retrying transaction with reduced feature level UDP. Nov 11 17:41:44 upgradeit systemd[1]: logrotate.service: Succeeded. Nov 11 17:41:44 upgradeit systemd[1]: Finished Rotate log files. Nov 11 17:41:44 upgradeit systemd-resolved[593]: Server returned error NXDOMAIN, mitigating potential DNS violation DVE-2018-0001, retrying transaction with reduced feature level UDP. Nov 11 17:41:44 upgradeit kernel: [12481.404326] kauditd_printk_skb: 25 callbacks suppressed Nov 11 17:41:44 upgradeit kernel: [12481.404327] audit: type=1400 audit(1605103904.687:37): apparmor="DENIED" operation="capable" profile="/usr/sbin/cups-browsed" pid=3266 comm="cups-browsed" capability=23 capname="sys_nice" Nov 11 17:41:44 upgradeit systemd[1]: man-db.service: Succeeded. Nov 11 17:41:44 upgradeit systemd[1]: Finished Daily man-db regeneration. Nov 11 17:41:45 upgradeit systemd-resolved[593]: Server returned error NXDOMAIN, mitigating potential DNS violation DVE-2018-0001, retrying transaction with reduced feature level UDP. kazemian@upgradeit:~$ kazemian@upgradeit:~$ head -n 3 /var/log/syslog Nov 11 17:41:44 upgradeit rsyslogd: [origin software="rsyslogd" swVersion="8.2001.0" x-pid="673" x-info="https://www.rsyslog.com"] rsyslogd was HUPed Nov 11 17:41:44 upgradeit systemd-resolved[593]: Server returned error NXDOMAIN, mitigating potential DNS violation DVE-2018-0001, retrying transaction with reduced feature level UDP. Nov 11 17:41:44 upgradeit systemd[1]: logrotate.service: Succeeded. kazemian@upgradeit:~$ |
دستور tail
با دستور tail میتوانید، n خط آخر یک فایل متنی را مشاهده نمایید. به طور پیشفرض تعداد ده خط آخر یک فایل در نظر گرفته شده است. با آپشن n- میتوانیم تعداد خطوط نمایش را تعیین نماییم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
kazemian@upgradeit:~$ tail /var/log/syslog Nov 11 17:51:07 upgradeit gnome-shell[1404]: Failed to store clipboard: Format UTF8_STRING not supported Nov 11 17:51:43 upgradeit anacron[3174]: Job `cron.weekly' started Nov 11 17:51:43 upgradeit anacron[4214]: Updated timestamp for job `cron.weekly' to 2020-11-11 Nov 11 17:51:43 upgradeit anacron[3174]: Job `cron.weekly' terminated Nov 11 17:51:55 upgradeit systemd[1022]: Starting Notification regarding a new release of Ubuntu... Nov 11 17:52:17 upgradeit check-new-release-gtk[4248]: /usr/lib/ubuntu-release-upgrader/check-new-release-gtk:30: PyGIWarning: Gtk was imported without specifying a version first. Use gi.require_version('Gtk', '3.0') before import to ensure that the right version gets loaded. Nov 11 17:52:17 upgradeit check-new-release-gtk[4248]: from gi.repository import Gtk Nov 11 17:52:17 upgradeit check-new-release-gtk[4248]: WARNING:root:timeout reached, exiting Nov 11 17:52:17 upgradeit systemd[1022]: update-notifier-release.service: Succeeded. Nov 11 17:52:17 upgradeit systemd[1022]: Finished Notification regarding a new release of Ubuntu. kazemian@upgradeit:~$ kazemian@upgradeit:~$ tail -n 3 /var/log/syslog Nov 11 17:52:17 upgradeit check-new-release-gtk[4248]: WARNING:root:timeout reached, exiting Nov 11 17:52:17 upgradeit systemd[1022]: update-notifier-release.service: Succeeded. Nov 11 17:52:17 upgradeit systemd[1022]: Finished Notification regarding a new release of Ubuntu. kazemian@upgradeit:~$ |
دستور sort
با این دستور، خطوط یک فایل برحسب حروف الفبا مرتب شده و نمایش داده میشود. در مثال زیر یک فایل با اسامی نامرتب میبینید که با دستور sort مرتب شدهاست:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
kazemian@upgradeit:~$ cat TestFile reza 75 mahmud 80 ahmad 35 soosan 12 farhad 90 milad 44 bahram 95 saeid 60 mahdi 95 ebrahim 77 kazemian@upgradeit:~$ kazemian@upgradeit:~$ sort TestFile ahmad 35 bahram 95 ebrahim 77 farhad 90 mahdi 95 mahmud 80 milad 44 reza 75 saeid 60 soosan 12 kazemian@upgradeit:~$ |
دستور wc
با این دستور تعداد خطوط، کلمات و حروف یک فایل متنی مشخص میگردد. در شکل زیر مشخصات فایل بالا به ترتیب از نظر تعداد خط، تعداد کلمات و تعداد حروف فایل را مشاهده مینمایید:
1 2 3 4 5 |
azemian@upgradeit:~$ wc TestFile 10 20 96 test.txt kazemian@upgradeit:~$ |
دستور uniq
دستور uniq خطهای تکراری و یکسان را حذف کرده و نمایش نمیدهد. و تنها هر خط یکبار بیشتر نمایش داده نمیشود. برای این کار در ابتدا باید خطوط مرتب شده و خروجی آن را دستور uniq اجرا نماید. برای مثال فایل test.txt حاوی چندین خط تکراری میباشد. در ابتدا آن را مرتب کرده و دستور uniq را اجرا مینماییم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
kazemian@upgradeit:~$ sort TestFile ahmad 35 ahmad 35 bahram 95 ebrahim 77 ebrahim 77 farhad 90 mahdi 95 mahdi 95 mahdi 95 mahmud 80 milad 44 reza 75 saeid 60 saeid 60 soosan 12 soosan 12 kazemian@upgradeit:~$ sort TestFile | uniq ahmad 35 bahram 95 ebrahim 77 farhad 90 mahdi 95 mahmud 80 milad 44 reza 75 saeid 60 soosan 12 kazemian@upgradeit:~$ |
دستور uniq با آپشن d- فقط خطوط تکراری را نمایش میدهد.
دستور cut
وقتی متنی دارای چندین ستون باشد. ستونهای دارای جداکننده (delimiter) میباشد. جداکنندهها میتوانند، فاصله، خطفاصله، سمیکالن، کالن و یا کاراکترهای خاص دیگر باشند. با دستور cut میتوانیم هر کدام از ستونهای متن را حذف و بقیه را نمایش دهیم. در مثال زیر فایلی با سه ستون میباشد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
kazemian@upgradeit:~$ cat TestFile reza 75 66 mahmud 80 76 ahmad 35 66 soosan 12 55 farhad 90 76 milad 44 45 bahram 95 65 saeid 60 77 mahdi 95 54 ebrahim 77 90 mahdi 95 56 ahmad 35 44 soosan 12 33 saeid 60 23 mahdi 95 45 ebrahim 77 35 kazemian@upgradeit:~$ cut -d ' ' -f1 TestFile reza mahmud ahmad soosan farhad milad bahram saeid mahdi ebrahim mahdi ahmad soosan saeid mahdi ebrahim kazemian@upgradeit::~$ |
دستور diff
دستور diff، یکی دیگر از برنامههای پردازش متن در لینوکس میباشد که برای مقایسهی بین دو فایل متنی، استفاده میشود. در این دستور، تفاوتهای متنی بین دو فایل نمایش داده میشود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
kazemian@upgradeit:~$ cat TextFile1 reza javad ahmad kazemian@upgradeit:~$ cat TextFile2 reza javad hassan kazemian@upgradeit:~$ diff TextFile1 TextFile2 3c3 < ahmad --- > hassan kazemian@upgradeit:~$ |
دستور tr
دستور tr برای جایگذاری و یا حذف کاراکتر(ها)یی در یک متن استفاده میشود. آپشن d- برای حذف و c- برای جایگذاری استفاده میشود.
1 2 3 4 5 6 7 8 9 10 11 |
kazemian@upgradeit:~$ tr a-z A-Z < TextFile1 REZA JAVAD AHMAD kazemian@upgradeit:~$ tr -d a < TextFile1 rez jvd hmd kazemian@upgradeit:~$ |
دستور grep
دستور grep برای جستجو در متن یا فایل متنی استفاده میگردد. این دستور قابلیت استفاده از regular expression را دارد. مثلا برای جستجوی کاربری به نام kazemian در فایل /etc/passwd از دستور زیر استفاده میگردد:
1 2 3 4 5 |
kazemian@upgradeit:~$ grep kazemian /etc/passwd kazemian:x:1000:1000:kazemian,,,:/home/kazemian:/bin/bash kazemian@upgradeit:~$ |
دستور sed
دستور sed یک دستور قدرتمند در نمایش و جایگذاری کلمات در یک فایل متن است. در مثال زیر کلمهی mahdi را در فایل TextFile1 جستجو میکند و خطوط حاوی این کلمه را حذف میکند. d! خطوطی را که حاوی این کلمه نباشد را حذف میکند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
kazemian@upgradeit:~$ cat TextFile1 reza javad ahmad Reza mahdi mahdi2 mahdi3 nima kazemian@upgradeit:~$ sed '/mahdi/d' TextFile1 reza javad ahmad Reza nima kazemian@upgradeit:~$ sed '/mahdi/!d' TextFile1 mahdi mahdi2 mahdi3 kazemian@upgradeit:~$ |
زبان برنامهنویسی پردازش متن awk
awk یک زبان برنامه نویسی، از نوع مفسر است. زبان برنامهنویسی از نوع مفسر، زبانی است که نیاز به کامپایل شدن ندارد و برنامه به صورت خط به خط در موقع اجرا، به زبان ماشین، ترجمه میشود. زبان awk برای پردازش متن، شامل جستجو و استخراج دادهها، طراحی شدهاست. زبان awk، یک زبان داده محور است. سبک برنامهنویسی با awk، نوشتن برنامهی تک خطی است. دادههای awk، یا از فایلهای متنی هستند و یا خروجی از، دستور دیگری است که توسط عمل piping، بدست آمده است. awk از regular expression یا regex برای پردازش متنها، استفاده میکند.
awk، با توجه به الگوهای متنی(text patterns) داده شده، خط به خط فایل متنی را، جستجو میکند. در صورتی که در هر خط، با الگوی متنی داده شده مطابقت داشت، عمل(action) داده شده بر روی آن خطوط اعمال میگردد. در مثال زیر، با استفاده از awk، در حالت اول، یک فایل متنی را نمایش میدهد. حالت دوم، تنها ستون دوم از فایل متنی را نمایش میدهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
kazemian@upgradeit:~$ awk '{print}' TextFile1 reza 23 javad 44 ahmad 45 Reza 56 mahdi 664 mahdi2 444 mahdi3 445 nima 445 kazemian@upgradeit:~$ awk '{print $2}' TextFile1 23 44 45 56 664 444 445 445 kazemian@upgradeit:~$ |
زبان برنامهنویسی perl
perl یک زبان همه منظورهی اسکریپتی است. ساختار پرل، شبیه زبان C است. پرل در زمینههای مختلفی همچون: هوش مصنوعی، بازی و طراحی اپلیکیشن کاربرد دارد. پرل، دارای قدرت بالایی، برای پردازش متن است و از regular expressions یا regex، برای پردازش متنها، استفاده میکند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
kazemian@upgradeit:~$ cat TextFile1 reza 23 javad 44 ahmad 45 Reza 56 mahdi 664 mahdi2 444 mahdi3 445 nima 445 kazemian@upgradeit:~$ perl -pe 's/m/%/' TextFile1 reza 23 javad 44 ah%ad 45 Reza 56 %ahdi 664 %ahdi2 444 %ahdi3 445 ni%a 445 kazemian@upgradeit:~$ |