grep فایلهای ورودی را برای یافتن سطرهایی که با الگوی داده شده مطابقت نمایند، جستجو میکند. وقتی یک مورد انطباق در یک سطر بیابد، آن سطر را به خروجی استاندارد کپی میکند( به طور پیشفرض )، یا هر خروجی دیگری که شما بابه کارگیری گزینههادرخواست کرده باشید.
به هرحال grep مطابقت با متن را انجام میدهد و غیر از حافظه در دسترس محدودیتی در طول سطر ورودی ندارد، و میتواند کاراکترهای مورد نظر را در داخل یک سطر مطابقت نماید. اگر آخرین بایت فایل ورودی یک کاراکتر سطر جدید نباشد، grep بدون صدا یکی ایجاد میکند. نظر به اینکه کاراکتر سطر جدید نیز یک جدا کننده لیست الگوها میباشد، هیچ راهی برای مطابقت کاراکترهای سطرجدید در یک متن وجود ندارد.
چند مثال:
cathy ~>
greproot
/etc/passwd
root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologincathy ~>
grep-n
root
/etc/passwd
1:root:x:0:0:root:/root:/bin/bash 12:operator:x:11:0:operator:/root:/sbin/nologincathy ~>
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/falsecathy ~>
grep-c
false
/etc/passwd
7cathy ~>
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 گنو استفاده میکنیم، که عبارتهای منظم توسعه یافته را پوشش میدهد. grep گنو پیشفرض سیستمهای لینوکس است. اگر شما از سیستمهای اختصاصی استفاده میکنید، با گزینه |
حالا ما از مثال قبل به طور صریح میخواهیم، سطرهایی که با رشته “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 ~>
grepexport
~/.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