راهنمای آموزشی اسکریپت نویسی - مقدماتی

لطفا برای بهتر دیدن صفحه از firefox استفاده کنید
Bash Guide for Beginners Machtelt Garrels

راهنمای Bash برای نوآموزان

فصل ۴ - عبارت‌های منظم »
« انطباق الگو با کاربرد ویژگی‌های Bash

مثال‌های کاربرد grep

grep چیست؟

grep فایلهای ورودی را برای یافتن سطرهایی که با الگوی داده شده مطابقت نمایند، جستجو می‌کند. وقتی یک مورد انطباق در یک سطر بیابد، آن سطر را به خروجی استاندارد کپی می‌کند( به طور پیش‌فرض )، یا هر خروجی دیگری که شما بابه کارگیری گزینه‌هادرخواست کرده باشید.

به هرحال grep مطابقت با متن را انجام می‌دهد و غیر از حافظه در دسترس محدودیتی در طول سطر ورودی ندارد، و می‌تواند کاراکترهای مورد نظر را در داخل یک سطر مطابقت نماید. اگر آخرین بایت فایل ورودی یک کاراکتر سطر جدید نباشد، grep بدون صدا یکی ایجاد می‌کند. نظر به اینکه کاراکتر سطر جدید نیز یک جدا کننده لیست الگوها می‌باشد، هیچ راهی برای مطابقت کاراکترهای سطرجدید در یک متن وجود ندارد.

چند مثال:

cathy ~> grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

cathy ~> grep -n root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
12:operator:x:11:0:operator:/root:/sbin/nologin

cathy ~> grep -v bash /etc/passwd | grep -v nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
news:x:9:13:news:/var/spool/news:
mailnull:x:47:47::/var/spool/mqueue:/dev/null
xfs:x:43:43:X Font Server:/etc/X11/fs:/bin/false
rpc:x:32:32:Portmapper RPC user:/:/bin/false
nscd:x:28:28:NSCD Daemon:/:/bin/false
named:x:25:25:Named:/var/named:/bin/false
squid:x:23:23::/var/spool/squid:/dev/null
ldap:x:55:55:LDAP User:/var/lib/ldap:/bin/false
apache:x:48:48:Apache:/var/www:/bin/false

cathy ~> grep -c false /etc/passwd
7

cathy ~> grep -i ps ~/.bash* | grep -v history
/home/cathy/.bashrc:PS1="\[\033[1;44m\]$USER is in \w\[\033[0m\] "

با اولین دستور کاربر cathy سطرهایی از فایل ‎/etc/passwd‎ که شامل کلمه root می‌باشند را نمایش می‌دهد.

سپس شماره سطرهایی که دارای این رشته جستجو می‌با‌شند را نمایش می‌دهد.

با سومین دستور، او کنترل می‌کند که کدام کاربران از bashاستفاده نمی‌کنند، ولی حسابهای کاربری با شل nologin نمایش داده نمی‌شوند.

بعد تعداد حسابهای کاربری که شل آنها عبارت ‎ /bin/false‎ می‌باشد را می‌شمارد.

آخرین فرمان سطرهای شامل رشته ps در همه فایل‌های دایرکتوری خانگی‌اش که با ‎ ~/.bash‎ شروع می‌شوند و فاقد رشته historyمی‌باشند را نمایش می‌دهد، به طوری که با‎ ~/.bash_history ‎ که می‌تواند شامل همان رشته، با حروف کوچک یا بزرگ باشد، منطبق نمی‌شود. توجه داشته باشید که جستجو برای رشته “ps” می‌باشد، نه برای فرمان ps.

حالا بیایید ببینیم بااستفاده از عبارت‌های منظم، با grep چه کار دیگری می‌توانیم انجام دهیم.

Grep و عبارتهای منظم

[Note]  اگر شما در لینوکس نیستید

ما در این مثال‌ها از grep گنو استفاده می‌کنیم، که عبارتهای منظم توسعه یافته را پوشش می‌دهد. grep گنو پیش‌فرض سیستم‌های لینوکس است. اگر شما از سیستم‌های اختصاصی استفاده می‌کنید، با گزینه V- نگارش مورد استفاده در سیستم خود را کنترل کنید. grep گنو را می‌توانید از آدرس ‎http://gnu.org/directory/‎ دانلود کنید.

سطر و کلمه‌لینک ها

حالا ما از مثال قبل به طور صریح می‌خواهیم، سطرهایی که با رشته “root”شروع می‌شوند را نمایش دهد:

cathy ~> grep ^root /etc/passwd
root:x:0:0:root:/root:/bin/bash

اگر بخواهیم ببینیم به کدام کاربران، هیچگونه پوسته‌ای اختصاص نیافته، سطرهایی را جستجو می‌کنیم که به “:”ختم می‌شوند:

cathy ~> grep :$ /etc/passwd
news:x:9:13:news:/var/spool/news:

برای بررسی آن که PATH در فایل ‎~/.bashrc‎ صادر شده است، اول سطرهای شامل “export” را انتخاب کرده وسپس سطرهای شامل رشته‌ای که با“PATH” شروع می‌شود را جستجو می‌کنیم، به طوری که مواردی همچون MANPATH و سایر pathهایی از این قبیل نمایش داده نمی‌شوند:

cathy ~> grep export ~/.bashrc | grep '\<PATH'
  export PATH="/bin:/usr/lib/mh:/lib:/usr/bin:/usr/local/bin:/usr/ucb:/usr/dbin:$PATH"

به طور مشابهی، ‎ \>‎ یعنی رشته بر انتهای کلمه منطبق ‌شود.

اگر می‌خواهید رشته‌ای را که یک کلمه جداگانه است بیابید( وجود فاصله در طرفین آن )، بهتر است از w- استفاده کنید، همچنان که ما در این مثال که می‌خواهیم اطلاعات پارتیشن ریشه را نمایش دهیم:

cathy ~> grep -w / /etc/fstab
LABEL=/                 /                       ext3    defaults        1 1

اگر این گزینه به کار نرود تمام سطرهای شامل کاراکتر / در فایل فوق نمایش داده خواهند شد.

کلاس‌های کاراکتر

A یک عبارت گروه‌بندی یک لیست از کاراکترهای محصور شده در “]” و “[” می‌باشد. این عبارت بر هر کاراکتر منفرد در در آن لیست منطبق می‌شود، اگر اولین کاراکتر لیست هشتک، “^”، باشد، آنوقت بر هر کاراکتری که در لیست نباشد انطباق می‌یابد. برای مثال، عبارت منظم ‎“[0123456789]”‎ بر هر عدد یک رقمی منطبق می‌گردد.

درون یک عبارت گروه‌بندی، یک عبارت دامنه از دو کاراکتر جداگانه و یک خط تیره تشکیل می‌شود. این عبارت دامنه بر هر کاراکتری که درترتیب بین دو کاراکتر واقع شود، منطبق می‌گردد، شامل، کاربرد تلفیق توالی منطقه‌ای و مجموعه کاراکتر می‌شود. برای مثال، در منطقه پیش‌فرض C، ‎“[a-d]”‎ معادل ‎“[abcd]”‎ می‌باشد. مرتب‌سازی کاراکتری در بسیاری از منطقه‌ها به ترتیب دیکشنری می‌باشد، و در این منطقه‌ها‎ “[a-d]”‎ نوعاً معادل با ‎“[abcd]”‎ نمی‌باشد، به عنوان مثال، می‌تواند معادل‎ “[aBbCcDd]”‎ باشد. برای به دست آوردن تفسیر سنتی عبارتهای گروه‌بندی، می‌توانید از منطقه C توسط تنظیم متغیر محیطی LC_ALL برابر با “C” استفاده کنید.

بالاخره،کلاس‌های کاراکتری معینی در عبارت‌های گروه‌بندی، از پیش تعریف شده می‌باشند. برای اطلاعات بیشتر در مورد این عبارت‌های پیش‌تعریف شده، صفحات man یا info برنامه grep را ملاحظه کنید.

cathy ~> grep [yf] /etc/group
sys:x:3:root,bin,adm
tty:x:5:
mail:x:12:mail,postfix
ftp:x:50:
nobody:x:99:
floppy:x:19:
xfs:x:43:
nfsnobody:x:65534:
postfix:x:89:

در این مثال، همه سطرهای شامل کاراکتر “y” یا “f” نمایش داده شده‌اند.

کاراکترهای عام

از کاراکتر “.” برای انطباق با یک کاراکتر منفرد استفاده کنید. اگر می‌خواهید لیست تمام کلمات پنج کاراکتری دیکشنری انگلیسی که با حرف “c” شروع و با حرف “h” تمام می‌شوند( قابل استفاده در جدول کلمات) را به دست آورید:

cathy ~> grep '\<c...h\>' /usr/share/dict/words
catch
clash
cloth
coach
couch
cough
crash
crush

اگر می‌خواهید سطرهای شامل خود کاراکتر نقطه را نمایش دهید، از گزینهF- در grep استفاده کنید.

برای انطباق چندتایی کاراکترها، از کاراکتر ستاره استفاده کنید. این مثال همه کلماتی که با “c” و با حرف “h”ختم می‌شوند را از دیکشنری سیستم انتخاب می‌کند:

cathy ~> grep '\<c.*h\>' /usr/share/dict/words
caliph
cash
catch
cheesecloth
cheetah
--output omitted--

اگرمی‌خواهید خود کاراکتر ستاره را در فایل یا خروجی بیابید، نقل‌قول تکی را به کار ببرید. Cathy در مثال زیر اول سعی می کند بدون استفاده از نقل‌قول تکی کاراکتر ستاره را در فایل ‎ /etc/profile‎ پیدا کند، که هیچ سطری را باز نمی‌گرداند. استفاده از نقل‌قول‌ها خروجی را تولید نموده است:

cathy ~> grep * /etc/profile

cathy ~> grep '*' /etc/profile
for i in /etc/profile.d/*.sh ; do
فصل ۴ - عبارت‌های منظم »
« انطباق الگو با کاربرد ویژگی‌های Bash
ترجمه محمود پهلوانی