لینوکس

تسلط بر grep با عبارات باقاعده برای جست‌وجوی کارآمد متن

مقدمه

دستور grep یکی از مفیدترین دستورات در محیط ترمینال لینوکس است. نام grep مخفف عبارت «global regular expression print» (چاپ سراسری عبارت باقاعده) است. این یعنی می‌توانید از grep استفاده کنید تا بررسی کنید که ورودی دریافت‌شده با یک الگوی مشخص مطابقت دارد یا نه. این برنامه که در نگاه اول ساده به نظر می‌رسد، فوق‌العاده قدرتمند است؛ توانایی‌اش در فیلترکردن ورودی بر اساس قوانین پیچیده، آن را به حلقه‌ای محبوب در بسیاری از زنجیره‌های دستور تبدیل کرده است.

در این آموزش، استفاده از grep همراه با عبارات باقاعده (Regular Expressions) را برای جست‌وجوی کارآمد متن — از مبانی تا تکنیک‌های پیشرفته — دنبال می‌کنیم. با تطبیق لفظی پایه شروع کرده و رایج‌ترین گزینه‌های خط فرمان grep را برای دقیق‌تر شدن جست‌وجوهایتان بررسی می‌کنیم. از آنجا، یاد می‌گیرید که الگوهای جست‌وجوی قدرتمندی بسازید؛ ابتدا با عبارات باقاعده پایه برای تطبیق الگوی بنیادی. سپس به عبارات باقاعده گستردهِ منعطف‌تر و عبارات باقاعده سازگار با پرل (PCRE) — که قابلیت‌های غنی‌تری دارند — پیش می‌رویم که جست‌وجوهای پیچیده‌تر و دقیق‌تری را ممکن می‌سازند. برای تثبیت درک شما، مثال‌های عملی و واقعی را مرور کرده و با ملاحظات کارایی به پایان می‌رسانیم تا بتوانید دستورات خود را برای سرعت و بهره‌وری بهینه کنید.

نکات کلیدی

  • دستور grep که مخفف «global regular expression print» است، بررسی می‌کند که ورودی دریافت‌شده با یک الگوی مشخص مطابقت دارد یا نه.
  • گزینه‌های رایج شامل i- برای بی‌توجهی به بزرگی و کوچکی حروف، v- برای یافتن خطوطی که الگو را ندارند و n- برای نمایش شماره خطوطِ تطبیق‌یافته است.
  • لنگرها (Anchor) کاراکترهای خاصی‌اند که مشخص می‌کنند تطبیق باید در کجا رخ دهد؛ مانند ^ برای ابتدای خط و $ برای انتهای خط.
  • از عبارات براکتی (‏[]) می‌توان برای مطابقت با هر یک کاراکتر از یک گروه مشخص استفاده کرد؛ درحالی‌که نقطه (.) با هر کاراکتر منفردی مطابقت می‌کند.
  • وقتی لازم است به‌دنبال کاراکتری بگردید که در عبارات باقاعده معنای خاصی دارد، باید آن را با یک بک‌اسلش (‏) «Escape» کنید.
  • فلگ E- یا دستور egrep، عبارات باقاعده گسترده را فعال می‌کند که متاکاراکترهای اضافی برای جایگزینی (|) و گروه‌بندی (()) دارند.
  • استفاده از فلگ P- عبارات باقاعده سازگار با پرل (PCRE) را باز می‌کند که قابلیت‌های پیشرفته‌ای مثل تطبیق تنبل (Lazy) و Lookaround را پشتیبانی می‌کند.
  • ابزار zgrep دقیقاً مثل grep کار می‌کند اما برای جست‌وجو در فایل‌های فشرده ‎.gz بدون نیاز به Decompress کردن ابتدایی آن‌ها استفاده می‌شود.
  • در گردش کارهای هوش مصنوعی و یادگیری ماشین، grep به‌عنوان ابزاری با کارایی بالا برای پاک‌سازی و پیش‌پردازش انبوه داده عالی عمل می‌کند.
  • grep برای هندل الگوهای چندخطی مناسب نیست؛ که برای آن‌ها ابزارهای جایگزینی مثل awk و perl مؤثرترند.

پیش‌نیازها

برای دنبال‌کردن این راهنما، به دسترسی به یک کامپیوتر با سیستم‌عامل مبتنی بر لینوکس نیاز دارید. این می‌تواند یک سرور خصوصی مجازی باشد که با SSH به آن متصل شده‌اید یا ماشین محلی خودتان. توجه کنید که این آموزش روی یک سرور لینوکسی در حال اجرای اوبونتو 22.04 اعتبارسنجی شده است؛ اما مثال‌های داده‌شده باید روی کامپیوتری با هر نسخه‌ای از هر توزیع لینوکسی کار کنند.

اگر قصد دارید از یک سرور راه‌دور برای دنبال‌کردن این راهنما استفاده کنید، تشویق می‌شوید ابتدا راهنمای «راه‌اندازی اولیه سرور» را کامل کنید. انجام این کار یک محیط سرور امن برایتان می‌سازد — شامل یک کاربر غیر root با دسترسی sudo و فایروال پیکربندی‌شده با UFW — که می‌توانید از آن برای تقویت مهارت‌های لینوکسی‌تان استفاده کنید.

استفاده پایه

در این آموزش، از grep برای جست‌وجوی واژه‌ها و عبارات مختلف در متن مجوز عمومی GNU (نسخه ۳) استفاده می‌کنید.

اگر روی سیستم اوبونتویی هستید، می‌توانید فایل را در پوشه /usr/share/common-licenses پیدا کنید. آن را به دایرکتوری خانه خود کپی کنید:

cp /usr/share/common-licenses/GPL-3 .

اگر روی سیستم دیگری هستید، از دستور curl برای دانلود یک نسخه استفاده کنید:

curl -o GPL-3 https://www.gnu.org/licenses/gpl-3.0.txt

در این آموزش از فایل مجوز BSD هم استفاده خواهید کرد. روی لینوکس، می‌توانید آن را با دستور زیر به دایرکتوری خانه خود کپی کنید:

cp /usr/share/common-licenses/BSD .

اگر روی سیستم دیگری هستید، فایل را با این دستور بسازید:

cat << 'EOF' > BSD
Copyright (c) The Regents of the University of California.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors
   may be used to endorse or promote products derived from this software
   without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
EOF

حالا که فایل‌ها را دارید، می‌توانید کار با grep را شروع کنید.

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

دستور زیر را اجرا کنید تا با grep به‌دنبال هر خطی بگردید که واژه GNU را در بر دارد:

grep "GNU" GPL-3

آرگومان اول یعنی GNU، الگویی است که به‌دنبالش می‌گردید و آرگومان دوم یعنی GPL-3، فایل ورودی‌ای است که می‌خواهید در آن جست‌وجو کنید.

خروجی حاصل، هر خطی خواهد بود که متن الگو را در بر دارد:

خروجی:

                    GNU GENERAL PUBLIC LICENSE
  The GNU General Public License is a free, copyleft license for
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
  Developers that use the GNU GPL protect your rights with two steps:
  "This License" refers to version 3 of the GNU General Public License.
  13. Use with the GNU Affero General Public License.
under version 3 of the GNU Affero General Public License into a single
...
...

روی برخی سیستم‌ها، الگویی که جست‌وجو کرده‌اید در خروجی هایلایت می‌شود.

گزینه‌های رایج

به‌صورت پیش‌فرض، grep در فایل ورودی به‌دنبال الگوی دقیق مشخص‌شده می‌گردد و خطوطی را که پیدا می‌کند برمی‌گرداند. با افزودن چند فلگ اختیاری به grep می‌توانید این رفتار را کاربردی‌تر کنید.

اگر می‌خواهید grep به بزرگی و کوچکی حروفِ پارامتر جست‌وجوی شما بی‌توجه باشد و هم вариант‌های حروف بزرگ و کوچک را پیدا کند، می‌توانید گزینه i- یا ‎–ignore-case را تعیین کنید.

با دستور زیر، هر نمونه از واژه license (با حروف بزرگ، کوچک یا ترکیبی) را در همان فایل قبلی جست‌وجو کنید:

grep -i "license" GPL-3

نتایج شامل LICENSE و license و License است:

خروجی:

                    GNU GENERAL PUBLIC LICENSE
 of this license document, but changing it is not allowed.
  The GNU General Public License is a free, copyleft license for
  The licenses for most software and other practical works are designed
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
price.  Our General Public Licenses are designed to make sure that you
(1) assert copyright on the software, and (2) offer you this License
  "This License" refers to version 3 of the GNU General Public License.
  "The Program" refers to any copyrightable work licensed under this
...
...

اگر نمونه‌ای با شکل LiCeNsE هم وجود داشت، برگردانده می‌شد.

اگر می‌خواهید همه خطوطی را پیدا کنید که یک الگوی مشخص را ندارند، می‌توانید از گزینه v- یا ‎–invert-match استفاده کنید.

با دستور زیر، هر خطی را که واژه the را در مجوز BSD ندارد جست‌وجو کنید:

grep -v "the" BSD

این خروجی را دریافت می‌کنید:

خروجی:

All rights reserved.

Redistribution and use in source and binary forms, with or without
are met:
    may be used to endorse or promote products derived from this software
    without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
...
...

چون گزینه «بی‌توجهی به بزرگی و کوچکی حروف» را تعیین نکرده بودید، دو مورد آخر به‌عنوان خطوطی که واژه the را ندارند برگردانده شدند.

اغلب دانستن شماره خطی که تطبیق‌ها روی آن رخ داده‌اند مفید است. این کار را می‌توانید با گزینه n- یا ‎–line-number انجام دهید. مثال قبلی را با افزودن این فلگ دوباره اجرا کنید:

grep -vn "the" BSD

این متن را برمی‌گرداند:

خروجی:

2:All rights reserved.
3:
4:Redistribution and use in source and binary forms, with or without
6:are met:
13:   may be used to endorse or promote products derived from this software
14:   without specific prior written permission.
15:
16:THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
17:ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
...
...

اکنون اگر بخواهید هر خطی را که the ندارد تغییر دهید، می‌توانید به شماره خط ارجاع بدهید. این به‌خصوص هنگام کار با کد منبع کاربردی است.

عبارات باقاعده

در مقدمه یاد گرفتید که grep مخفف «global regular expression print» است. یک «عبارت باقاعده» رشته متنی‌ای است که یک الگوی جست‌وجوی خاص را توصیف می‌کند.

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

تطبیق‌های لفظی

در مثال‌های قبلی این آموزش، وقتی به‌دنبال واژه‌های GNU و the می‌گشتید، در واقع در حال جست‌وجوی عبارات باقاعده پایه‌ای بودید که با رشته دقیق کاراکترهای GNU و the مطابقت داشتند. الگوهایی که کاراکترهای مورد تطبیق را دقیقاً مشخص می‌کنند، «لفظی» (Literal) نامیده می‌شوند؛ چون الگو را لفظی‌به‌لفظی و کاراکتر‌به‌کاراکتر تطبیق می‌دهند.

مفید است که این‌ها را به‌عنوان تطبیق یک رشته از کاراکترها در نظر بگیرید، نه تطبیق یک واژه. این تمایز با یادگیری الگوهای پیچیده‌تر، اهمیت بیشتری پیدا می‌کند.

تمام کاراکترهای الفبایی و عددی (و همچنین برخی کاراکترهای دیگر) به‌صورت لفظی تطبیق داده می‌شوند؛ مگر اینکه توسط مکانیزم‌های دیگرِ عبارت تغییر کنند.

تطبیق‌های لنگر

لنگرها (Anchor) کاراکترهای خاصی‌اند که مشخص می‌کنند تطبیق باید در کجای خط رخ دهد تا معتبر باشد.

مثلاً، با استفاده از لنگرها می‌توانید تعیین کنید که فقط خطوطی را می‌خواهید که GNU را درست در ابتدای خط دارند. برای این کار، می‌توانید لنگر ^ را قبل از رشته لفظی قرار دهید.

دستور زیر را اجرا کنید تا در فایل GPL-3 خطوطی را پیدا کنید که GNU درست در ابتدای آن‌ها رخ داده است:

grep "^GNU" GPL-3

این دستور دو خط زیر را برمی‌گرداند:

خروجی:

GNU General Public License for most of our software; it applies also to
GNU General Public License, you may choose any version ever published

به‌طور مشابه، لنگر $ را در انتهای الگو استفاده می‌کنید تا نشان دهید تطبیق فقط وقتی معتبر است که درست در انتهای خط رخ دهد.

این دستور با هر خطی که به واژه and ختم می‌شود در فایل GPL-3 مطابقت می‌کند:

grep "and$" GPL-3

این خروجی را دریافت می‌کنید:

خروجی:

that there is no warranty for this free software.  For both users' and
  The precise terms and conditions for copying, distribution and
  License.  Each licensee is addressed as "you".  "Licensees" and
receive it, in any medium, provided that you conspicuously and
    alternative is allowed only occasionally and noncommercially, and
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
provisionally, unless and until the copyright holder explicitly and
receives a license from the original licensors, to run, modify and
make, use, sell, offer for sale, import and otherwise run, modify and

تطبیق هر کاراکتر

کاراکتر نقطه (.) در عبارات باقاعده به این معناست که هر کاراکتر منفردی می‌تواند در آن مکان مشخص وجود داشته باشد.

مثلاً، برای تطبیق هر چیزی در فایل GPL-3 که دو کاراکتر و سپس رشته cept دارد، از الگوی زیر استفاده می‌کنید:

grep "..cept" GPL-3

این دستور خروجی زیر را برمی‌گرداند:

خروجی:

use, which is precisely where it is most unacceptable.  Therefore, we
infringement under applicable copyright law, except executing it on a
tells the user that there is no warranty for the work (except to the
License by making exceptions from one or more of its conditions.
form of a separately written license, or stated as exceptions;
  You may not propagate or modify a covered work except as expressly
  9. Acceptance Not Required for Having Copies.
...
...

این خروجی هم نمونه‌هایی از accept و هم except و variante‌هایی از این دو واژه را دارد. اگر رشته z2cept هم پیدا می‌شد، الگو با آن هم مطابقت می‌داد.

عبارات براکتی

با قرار دادن گروهی از کاراکترها داخل براکت (‏[ و ])، می‌توانید تعیین کنید که کاراکترِ آن مکان می‌تواند هر یک کاراکترِ موجود در گروه براکتی باشد.

مثلاً، برای یافتن خطوطی که شامل too یا two هستند، می‌توانید این variante‌ها را با الگوی زیر مختصر تعیین کنید:

grep "t[wo]o" GPL-3

خروجی نشان می‌دهد که هر دو variante در فایل وجود دارند:

خروجی:

your programs, too.
freedoms that you received.  You must make sure that they, too, receive
  Developers that use the GNU GPL protect your rights with two steps:
a computer network, with no transfer of a copy, is not conveying.
System Libraries, or general-purpose tools or generally available free
    Corresponding Source from a network server at no charge.
...
...

نشانه‌گذاری براکتی گزینه‌های جالبی به شما می‌دهد. می‌توانید الگو را با هر چیزی به‌جز کاراکترهای داخل براکت مطابقت بدهید؛ با شروع‌کردن فهرست کاراکترهای داخل براکت با کاراکتر ^.

این مثال شبیه الگوی .ode است اما با الگوی code مطابقت نمی‌دهد:

grep "[^c]ode" GPL-3

خروجی‌ای که دریافت می‌کنید:

خروجی:

  1. Source Code.
    model, to give anyone who possesses the object code either (1) a
the only significant mode of use of the product.
notice like this when it starts in an interactive mode:

توجه کنید که در خط دوم برگردانده‌شده، در واقع واژه code وجود دارد. این شکستِ عبارت باقاعده یا grep نیست؛ بلکه این خط به این دلیل برگردانده شده که در بخشی قبلتر از خط، الگوی mode — که داخل واژه model پیدا شده — وجود داشته است. خط برگردانده شد چون نمونه‌ای که با الگو مطابقت داشت وجود داشت.

قابلیت مفید دیگر براکت‌ها این است که می‌توانید به‌جای تایپ جداگانه هر کاراکتر موجود، یک بازه از کاراکترها تعیین کنید.

این یعنی اگر می‌خواهید هر خطی را که با حرف بزرگ شروع می‌شود پیدا کنید، می‌توانید از الگوی زیر استفاده کنید:

grep "^[A-Z]" GPL-3

خروجی این عبارت به این شکل است:

خروجی:

GNU General Public License for most of our software; it applies also to
States should not allow patents to restrict development and use of
License.  Each licensee is addressed as "you".  "Licensees" and
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
System Libraries, or general-purpose tools or generally available free
Source.
User Product is transferred to the recipient in perpetuity or for a
...
...

به دلیل برخی مشکلات مرتب‌سازی قدیمی، استفاده از کلاس‌های کاراکتری POSIX اغلب دقیق‌تر از بازه‌های کاراکتری است که همین الان استفاده کردید.

بحث درباره همه کلاس‌های کاراکتری POSIX فراتر از محدوده این راهنماست؛ اما مثالی که همان کارِ مثال قبلی را انجام می‌دهد، از کلاس کاراکتری [:upper:] داخل یک انتخاب‌کننده براکتی استفاده می‌کند:

grep "^[[:upper:]]" GPL-3

خروجی مثل قبل خواهد بود.

تکرار الگو صفر بار یا بیشتر

در نهایت، یکی از پرکاربردترین متاکاراکترها، ستاره یا * است که یعنی «کاراکتر یا عبارت قبلی را صفر بار یا بیشتر تکرار کن».

برای یافتن هر خطی در فایل GPL-3 که یک پرانتز باز و بسته دارد و بین آن‌ها فقط حروف و فاصله‌های منفرد است، از عبارت زیر استفاده کنید:

grep "([A-Za-z ]*)" GPL-3

این خروجی را می‌گیرید:

خروجی:

 Copyright (C) 2007 Free Software Foundation, Inc.
distribution (with or without modification), making available to the
than the work as a whole, that (a) is included in the normal form of
Component, and (b) serves only to enable use of the work with that
(if any) on which the executable work runs, or a compiler used to
    (including a physical distribution medium), accompanied by the
    (including a physical distribution medium), accompanied by a
    place (gratis or for a charge), and offer equivalent access to the
...
...

تا اینجا از نقطه‌ها، ستاره‌ها و کاراکترهای دیگر در عبارت‌هایتان استفاده کردید؛ اما گاهی لازم است دقیقاً به‌دنبال خودِ آن کاراکترها بگردید.

فرار دادن متاکاراکترها

مواقعی هست که باید به‌دنبال یک نقطه لفظی یا یک براکت باز لفظی بگردید؛ به‌خصوص هنگام کار با کد منبع یا فایل‌های پیکربندی. چون این کاراکترها در عبارات باقاعده معنای خاصی دارند، باید آن‌ها را «Escape» کنید تا به grep بگویید که در این مورد نمی‌خواهید از معنای خاصشان استفاده کنید.

Escape کردن کاراکترها با استفاده از کاراکتر بک‌اسلش () در جلوی کاراکتری که معمولاً معنای خاصی دارد انجام می‌شود.

مثلاً، برای یافتن هر خطی که با حرف بزرگ شروع شده و با نقطه تمام می‌شود، از عبارت زیر استفاده کنید که نقطه پایانی را Escape می‌کند تا به‌جای معنای معمولِ «هر کاراکتری»، یک نقطه لفظی را نشان بدهد:

grep "^[A-Z].*\.$" GPL-3

خروجی‌ای که می‌بینید:

خروجی:

Source.
License by making exceptions from one or more of its conditions.
License would be to refrain entirely from conveying the Program.
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
SUCH DAMAGES.
Also add information on how to contact you by electronic and paper mail.

حالا بیایید به گزینه‌های دیگر عبارات باقاعده نگاه کنیم.

عبارات باقاعده گسترده

دستور grep با استفاده از فلگ E- یا با فراخوانی دستور egrep به‌جای grep، از یک زبان عبارت باقاعده گسترده‌تری پشتیبانی می‌کند.

این گزینه‌ها قابلیت‌های «عبارات باقاعده گسترده» را باز می‌کنند. عبارات باقاعده گسترده همه متاکاراکترهای پایه را به‌همراه متاکاراکترهای اضافی برای بیان تطبیق‌های پیچیده‌تر در بر می‌گیرند.

گروه‌بندی

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

برای گروه‌بندی عبارت‌ها، آن‌ها را داخل پرانتز قرار بدهید. اگر می‌خواهید بدون استفاده از عبارات باقاعده گسترده از پرانتزها استفاده کنید، می‌توانید آن‌ها را با بک‌اسلش Escape کنید تا این قابلیت فعال شود. این یعنی هر سه عبارت زیر از نظر عملکردی معادل‌اند:

grep "\(grouping\)" file.txt
grep -E "(grouping)" file.txt
egrep "(grouping)" file.txt

جایگزینی

مشابه نحوه‌ای که عبارات براکتی می‌توانند انتخاب‌های ممکن مختلفی برای تطبیق کاراکتر منفرد تعیین کنند، جایگزینی (Alternation) به شما اجازه می‌دهد تطبیق‌های جایگزین را برای رشته‌ها یا مجموعه‌های عبارت تعیین کنید.

برای نشان‌دادن جایگزینی، از کاراکتر پایپ | استفاده کنید. این‌ها اغلب داخل گروه‌بندی پرانتزی برای تعیین اینکه یکی از دو یا چند امکان باید تطبیق در نظر گرفته شود، استفاده می‌شوند.

عبارت زیر یا GPL یا General Public License را در متن پیدا می‌کند:

grep -E "(GPL|General Public License)" GPL-3

خروجی به این شکل است:

خروجی:

  The GNU General Public License is a free, copyleft license for
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
price.  Our General Public Licenses are designed to make sure that you
  Developers that use the GNU GPL protect your rights with two steps:
  For the developers' and authors' protection, the GPL clearly explains
authors' sake, the GPL requires that modified versions be marked as
have designed this version of the GPL to prohibit the practice for those
...
...

جایگزینی می‌تواند بین بیش از دو انتخاب، با افزودن انتخاب‌های اضافیِ جدا شده با کاراکترهای پایپ (|) اضافی داخل گروه انتخاب، تعیین شود.

سنجنده‌های تعداد

مثل متاکاراکتر * که کاراکتر یا مجموعه کاراکتر قبلی را صفر بار یا بیشتر تطبیق می‌داد، متاکاراکترهای دیگری هم در عبارات باقاعده گسترده موجودند که تعداد رخدادها را تعیین می‌کنند.

برای تطبیق یک کاراکتر صفر یا یک بار، می‌توانید از کاراکتر ? استفاده کنید. این عملاً کاراکتر یا مجموعه کاراکترهای قبل از آن را اختیاری می‌کند.

عبارت زیر با قرار دادن copy در یک گروه اختیاری، با copyright و right مطابقت می‌کند:

grep -E "(copy)?right" GPL-3

این خروجی را دریافت می‌کنید:

خروجی:

 Copyright (C) 2007 Free Software Foundation, Inc.
  To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you have
know their rights.
  Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
  "Copyright" also means copyright-like laws that apply to other kinds of
...

کاراکتر + یک عبارت را یک بار یا بیشتر تطبیق می‌دهد. این تقریباً مثل متاکاراکتر * است؛ اما با کاراکتر +، عبارت باید حداقل یک بار مطابقت کند.

عبارت زیر با رشته free به‌علاوه یک یا چند کاراکتری که کاراکتر فاصله سفید نیستند مطابقت می‌کند:

grep -E "free[^[:space:]]+" GPL-3

این خروجی را می‌بینید:

خروجی:

  The GNU General Public License is a free, copyleft license for
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
  When we speak of free software, we are referring to freedom, not
have the freedom to distribute copies of free software (and charge for
you modify it: responsibilities to respect the freedom of others.
freedoms that you received.  You must make sure that they, too, receive
protecting users' freedom to change the software.  The systematic
of the GPL, as needed to protect the freedom of users.
patents cannot be used to render the program non-free.

تعیین تکرار تطبیق

برای تعیین تعداد دفعات تکرار یک تطبیق، از کاراکترهای آکولاد ({ و }) استفاده کنید. این کاراکترها به شما اجازه می‌دهند یک تعداد دقیق، یک بازه یا سقف/کف تعداد دفعاتی که یک عبارت می‌تواند تطبیق شود را تعیین کنید.

از عبارت زیر برای یافتن همه خطوط فایل GPL-3 که شامل سه‌گانه‌های حروف صدادار (Vowel) هستند، استفاده کنید:

grep -E "[AEIOUaeiou]{3}" GPL-3

هر خط برگردانده‌شده واژه‌ای با سه حرف صدادار دارد:

خروجی:

changed, so that their problems will not be attributed erroneously to
authors of previous versions.
receive it, in any medium, provided that you conspicuously and
give under the previous paragraph, plus a right to possession of the
covered work so as to satisfy simultaneously your obligations under this

برای تطبیق هر واژه‌ای که بین ۱۶ تا ۲۰ کاراکتر دارد، از عبارت زیر استفاده کنید:

grep -E "[[:alpha:]]{16,20}" GPL-3

خروجی این دستور:

خروجی:

    certain responsibilities if you distribute copies of the software, or if
    you modify it: responsibilities to respect the freedom of others.
        c) Prohibiting misrepresentation of the origin of that material, or

فقط خطوطی که واژه‌هایی با آن طول دارند نمایش داده می‌شوند.

تطبیق الگوی پیشرفته با PCRE (‏grep -P)

درحالی‌که عبارات باقاعده گسترده (‏-E) قدرت زیادی اضافه می‌کنند، برخی سیستم‌ها موتوری حتی غنی‌تر هم ارائه می‌دهند: عبارات باقاعده سازگار با پرل (PCRE). می‌توانید این قابلیت را با فلگ P- باز کنید. این موتور در زبان‌های برنامه‌نویسی مثل Python و JavaScript رایج است و قابلیت‌های پیشرفته را مستقیماً به خط فرمان شما می‌آورد.

توجه: گزینه P- یک افزونه GNU است و ممکن است روی همه سیستم‌ها در دسترس نباشد؛ مثل نسخه پیش‌فرض grep روی macOS (که مبتنی بر BSD است).

بیایید دو قابلیت قدرتمندی را که PCRE فعال می‌کند بررسی کنیم: تطبیق تنبل و Lookaroundها.

تطبیق حریص در برابر تنبل

به‌صورت پیش‌فرض، سنجنده‌های تعدادی مثل * و + حریص‌اند. این یعنی سعی می‌کنند بلندترین رشته ممکن را تطبیق دهند. مثلاً، اگر متن <a>test1</a> <a>test2</a> را داشته باشید و سعی کنید یک تگ HTML را با <.*> تطبیق دهید، الگو با کل رشته از اولین < تا آخرین > مطابقت می‌کند.

فایلی با نام tags.html بسازید تا این را در عمل ببینید:

echo '<a>test1</a> <a>test2</a>' > tags.html

حالا یک جست‌وجوی حریص اجرا کنید:

grep -P -o "<.*>" tags.html

فلگ o- به grep می‌گوید فقط بخش تطبیق‌یافته خط را خروجی بدهد. نتیجه کل خط است — که اغلب چیز موردنظر شما نیست:

خروجی:

<a>test1</a> <a>test2</a>

برای حل این مشکل، می‌توانید سنجنده را با افزودن یک ? بعدش، تنبل کنید. یک سنجنده تنبل کوتاه‌ترین رشته ممکن را تطبیق می‌دهد.

grep -P -o "<.*?>" tags.html

این به‌درستی هر تگ را به‌عنوان یک تطبیق جداگانه شناسایی می‌کند:

خروجی:

<a>
</a>
<a>
</a>

تطبیق تنبل زمانی ضروری است که در حال تجزیه (Parse) متنی با جداکننده‌های شروع و پایان مشخص اما محتوای متغیر بین آن‌ها هستید.

Lookaroundها

Lookaroundها ادعاهای عرض-صفر (Zero-Width) هستند. به شما اجازه می‌دهند وجود یک الگو را قبل (Lookbehind) یا بعد (Lookahead) از الگوی اصلی‌تان بررسی کنید؛ بدون آنکه آن را در تطبیق واقعی بگنجانید. این برای تطبیق بر اساس زمینه (Context) فوق‌العاده مفید است.

  • Lookahead مثبت (‏?=…)‏: ادعا می‌کند که زیرالگوی … باید بعد از الگوی اصلی بیاید.
  • Lookbehind مثبت (‏?<=…)‏: ادعا می‌کند که زیرالگوی … باید قبل از الگوی اصلی بیاید.

تصور کنید می‌خواهید هر نمونه از واژه «license» را در GPL-3 پیدا کنید؛ اما فقط وقتی که بلافاصله واژه «document» بعدش می‌آید.

grep -P -o "license(?= document)" GPL-3

خروجی فقط واژه license را نشان می‌دهد؛ هرچند تطبیق به واژه documentِ بعدش وابسته بوده است:

خروجی:

license

به‌طور مشابه، می‌توانستید از یک Lookbehind مثبت برای یافتن عددی که رشته “version ” قبلش آمده استفاده کنید.

grep -P -o "(?<=version )[0-9]" GPL-3

این دستور شماره نسخه ۳ را از عبارت «version 3» پیدا می‌کند؛ بدون در بر گرفتن “version ” در خروجی.

خروجی:

3
3
3

Lookaroundها ابزاری قدرتمند برای استخراج اطلاعات دقیق از متن ساختاریافته‌اند.

کارایی، قابلیت انتقال و اسکریپت‌نویسی پیشرفته

وقتی با قابلیت‌های اصلی grep راحت شدید، می‌توانید روی سریع‌تر کردن جست‌وجوها، قابل‌اتکاتر کردن اسکریپت‌ها و کارآمدتر کردن گردش کار خود تمرکز کنید.

کارایی و بهینه‌سازی

همه عبارات باقاعده یکسان ساخته نمی‌شوند. یک الگوی بدنویسی‌شده می‌تواند به‌طور چشمگیری کندتر از یک الگوی کارآمد باشد؛ به‌خصوص روی فایل‌های بزرگ.

  • کارایی Regex: نسبت به الگوهای پیچیده با سنجنده‌های تو در تو و جایگزینی — مثل ‏(a|b*)+‏ — محتاط باشید. این‌ها می‌توانند به وضعیتی معروف به Backtracking فاجعه‌بار منجر شوند؛ جایی که زمان اجرای موتور Regex به‌صورت نمایی رشد می‌کند. هر جا ممکن است، الگوهای مشخص‌تری بنویسید و از ابهام اجتناب کنید.
  • جایگزین‌های مدرن: برای جست‌وجو در کدبیس‌های بزرگ، ابزارهایی مثل ripgrep (‏rg) برای سرعت ساخته شده‌اند. این‌ها اغلب با بهره‌گیری از موازی‌کاری (Parallelism) و پیش‌فرض‌های هوشمند — مثل نادیده‌گرفتن خودکار فایل‌های فهرست‌شده در ‎.gitignore شما — از grep بهتر عمل می‌کنند.
  • فلگ‌های کارایی مفید:
    • ‏--line-buffered: وقتی grep بخشی از یک خط لوله (Pipeline) است (مثلاً ‏tail -f logfile | grep 'ERROR')، این فلگ آن را وادار می‌کند خروجی را خط‌به‌خط پردازش کند. این برای مانیتورینگ لاگ در زمان واقعی حیاتی است و تضمین می‌کند تطبیق‌ها را همان لحظه که رخ می‌دهند ببینید؛ نه اینکه منتظر پر شدن بافر خروجی بمانید.
    • ‏--mmap: روی برخی سیستم‌ها، این گزینه می‌تواند با استفاده از I/O نگاشت‌شده در حافظه (Memory-Mapped) برای خواندن فایل‌ها — که برای فایل‌های خیلی بزرگ می‌تواند از عملیات خواندن استاندارد سریع‌تر باشد — کارایی را بهبود بدهد.

قابلیت انتقال و varianteهای grep

یک اسکریپت شل که روی ماشین لینوکسی شما کار می‌کند، ممکن است روی مکِ همکارتان شکست بخورد. این اغلب به دلیل تفاوت‌های بین grep مربوط به GNU (استاندارد روی لینوکس) و grep مربوط به BSD (استاندارد روی macOS) است. grep مربوط به GNU عموماً قابلیت‌های بیشتری دارد؛ مثل موتور PCRE (‏-P) و گزینه‌های پیشرفته‌تر. اگر قابلیت انتقال (Portability) هدف است، همیشه اسکریپت‌های خود را در محیط‌های مختلف تست کنید.

برای یک کار رایج مدیر سیستم — مثل جست‌وجو در فایل‌های لاگ فشرده — نیازی به Decompress کردن ابتدایی آن‌ها ندارید. ابزار zgrep دقیقاً مثل grep کار می‌کند اما روی فایل‌های فشرده ‎.gz:

zgrep "ERROR" /var/log/syslog.2.gz

این دستور به‌دنبال «ERROR» داخل فایل فشرده syslog.2.gz می‌گردد؛ بدون ساخت فایل موقتِ Decompress شده.

تکنیک‌های اسکریپت‌نویسی پیشرفته

هنگام ساخت اسکریپت‌ها، استحکام (Robustness) کلیدی است. نام فایل‌هایی با فاصله یا کاراکترهای خاص می‌توانند خطوط لوله ساده را خراب کنند.

  • خطوط لوله امن با ‎–null: دستور grep -l فایل‌های حاوی تطبیق را فهرست می‌کند. اگر این فهرست را به دستور دیگری مثل xargs بفرستید، نام فایل‌هایی که فاصله دارند خطا ایجاد می‌کنند. برای حل این مشکل، از گزینه Z- یا ‎–null استفاده کنید که نام فایل‌ها را با کاراکتر Null به‌جای خط جدید جدا می‌کند. دستور xargs سپس می‌تواند این ورودی را با گزینه 0- خود بخواند.
grep -lZ "pattern" /path/* | xargs -0 rm

این دستور به‌طور ایمن همه فایل‌های /path/ را که «pattern» را دارند پیدا کرده و حذف می‌کند؛ حتی اگر نام‌شان شامل فاصله یا کاراکترهای خاص دیگر باشد.

  • ورودی توصیفی با ‎–label: وقتی ورودی را از دستور دیگری به grep می‌فرستید، منبع معمولاً با برچسب (standard input) نشان داده می‌شود. فلگ ‎–label به شما اجازه می‌دهد نام توصیفی‌تری تخصیص بدهید؛ که برای ساخت لاگ‌ها یا خروجی اسکریپت‌های شفاف‌تر مفید است.
echo "This is an error" | grep --label="ErrorStream" "error"

خروجی:

ErrorStream: This is an error

موارد کاربرد عملی

۱. اعتبارسنجی فیلدهای CSV

برای اعتبارسنجی فیلدهای CSV می‌توانید از grep همراه با عبارات باقاعده برای بررسی الگوها یا قالب‌های خاص استفاده کنید. مثلاً، برای بررسی اینکه آیا همه خطوط یک فایل CSV دقیقاً ۵ فیلد جدا شده با کاما دارند، از این دستور استفاده کنید:

grep -E "^[^,]+,[^,]+,[^,]+,[^,]+,[^,]+$" yourfile.csv

این دستور فقط خطوطی را چاپ می‌کند که با الگوی مشخص‌شده مطابقت دارند و نشان‌دهنده فیلدهای CSV معتبرند.

۲. فیلترکردن لاگ‌ها بر اساس سطح خطا (مثلاً grep “ERROR” logs.txt)

فیلترکردن لاگ‌ها بر اساس سطح خطا یک مورد کاربرد رایج grep است. برای فیلترکردن خطوط حاوی واژه «ERROR»، از این دستور استفاده کنید:

grep "ERROR" logs.txt

این دستور همه خطوط logs.txt را که واژه «ERROR» را دارند چاپ می‌کند تا روی پیام‌های خطا تمرکز کنید.

۳. جست‌وجو در کد منبع برای توابع خاص

هنگام جست‌وجو در کد منبع، grep می‌تواند برای یافتن توابع یا الگوهای خاص استفاده شود. مثلاً، برای یافتن همه رخدادهای تابعی با نام calculateTotal در یک دایرکتوری از فایل‌های کد منبع:

grep -r "calculateTotal" /path/to/source/code/directory

این دستور به‌صورت بازگشتی در همه فایل‌های دایرکتوری مشخص‌شده جست‌وجو کرده و خطوطی را که نام تابع را دارند چاپ می‌کند.

۴. تطبیق URLها یا آدرس‌های ایمیل در متن

از عبارات باقاعده می‌توان برای تطبیق URLها یا آدرس‌های ایمیل در متن استفاده کرد. مثلاً، برای یافتن همه خطوط یک فایل که URL دارند:

grep -E "https?://[^ ]+" yourfile.txt

این دستور همه خطوطی را چاپ می‌کند که URLای شروع‌شده با «http://» یا «https://» دارند.

۵. پیش‌پردازش NLP: حذف خطوط دارای Stopword

Stopwordها واژه‌های رایجی مثل «the» و «and» و… هستند که در جمله معنای زیادی حمل نمی‌کنند. برای حذف خطوطی که Stopword دارند، می‌توانید از grep با فهرستی از Stopwordها استفاده کنید. مثلاً، برای حذف خطوطی که Stopwordهای «the»، «and» یا «a» را دارند:

grep -vE "the|and|a" yourfile.txt

این دستور همه خطوطی را چاپ می‌کند که هیچ‌کدام از Stopwordهای مشخص‌شده را ندارند.

۶. تشخیص ورودی‌های شبه‌تکراری یا غلط‌های املایی

از عبارات باقاعده می‌توان برای تشخیص ورودی‌های شبه‌تکراری یا غلط‌های املایی با تطبیق الگوهای مشابه استفاده کرد. مثلاً، برای یافتن خطوطی که واژه‌هایی با تفاوت یک کاراکتری دارند:

grep -E "(\w)\1" yourfile.txt

این دستور همه خطوطی را چاپ می‌کند که واژه‌هایی با یک کاراکتر تکرارشده دارند؛ که نشان‌دهنده شبه‌تکرارها یا غلط‌های املایی احتمالی است.

۷. الگوهای Regex برای موجودیت‌های نامی یا عبارات رایج

از عبارات باقاعده می‌توان برای تطبیق موجودیت‌های نامی (Named Entity) یا عبارات رایج در متن استفاده کرد. مثلاً، برای یافتن همه خطوطی که عبارت خاصی مثل «named entity recognition» را دارند:

grep -E "named entity recognition" yourfile.txt

این دستور همه خطوطی را که عبارت مشخص‌شده را دارند چاپ می‌کند تا روی اطلاعات مرتبط تمرکز کنید.

۸. DevOps: فیلترکردن لاگ‌های CI/CD

خطوط لوله یکپارچسازی و استقرار پیوسته می‌توانند هزاران خط خروجی لاگ تولید کنند. grep برای یافتن سریع منبع یک شکست جایگزین‌ناپذیر است. می‌توانید دستورات grep را با v- زنجیر کنید تا «نویز»های روتین را حذف کرده و روی خطاهای بحرانی تمرکز کنید.

یک لاگ Build مفصلی به نام build.log را تصور کنید. می‌خواهید پیام‌های خطا را پیدا کنید اما هشدارهای رایج درباره منسوخ‌شدن (Deprecation) را حذف کنید.

grep "ERROR" build.log | grep -v "DEPRECATED"

این خط لوله ابتدا همه خطوط حاوی «ERROR» را انتخاب کرده و سپس هر کدام از آن خطوط را که «DEPRECATED» هم دارند فیلتر می‌کند؛ و به شما کمک می‌کند روی شکست‌های قابل‌اقدام متمرکز شوید.

۹. مدیریت سیستم: جست‌وجو در لاگ‌های سیستمی

مدیران سیستم اغلب از grep برای تجزیه (Parse) لاگ‌های تولیدشده توسط سرویس‌ها استفاده می‌کنند. روی سیستم‌های مدرن لینوکسی که از systemd استفاده می‌کنند، لاگ‌ها توسط journalctl مدیریت می‌شوند. می‌توانید خروجی آن را به grep بفرستید تا مشکلات سرویس را سریع تشخیص دهید.

برای یافتن همه ورودی‌های لاگِ وب‌سرور NGINX که واژه «failed» را دارند (بی‌توجه به بزرگی و کوچکی حروف):

journalctl -u nginx.service | grep -i "failed"

این دستور تک‌خطی اغلب اولین قدم در عیب‌یابی یک سرویس سیستمیِ در حال شکست است.

۱۰. امنیت: اسکن برای اطلاعات محرمانه در معرض نمایش

یک اشتباه امنیتی رایج، Commit کردن اطلاعات احراز هویت یا کلیدهای API در یک مخزن کد است. grep می‌تواند یک اسکن سریع و بازگشتی از یک دایرکتوری برای یافتن این اطلاعات محرمانه انجام دهد.

برای جست‌وجوی بازگشتی (‏r-) در دایرکتوری فعلی برای الگوهای رایج مثل API_KEY، با بی‌توجهی به بزرگی و کوچکی حروف (‏i-):

grep -r -i "API_KEY" .

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

grep در عصر هوش مصنوعی

اگرچه grep یک کلاسیک خط فرمانیِ ساخته‌شده در دهه ۱۹۷۰ است، ارتباطش در عصر مدرن هوش مصنوعی کم نشده است. نقش آن از یک ابزار جست‌وجوی ساده به جزئی حیاتی در اکوسیستم پیچیده ابزارهای توسعه‌دهندگان تکامل یافته است. امروز، grep به‌عنوان ابزار پایه‌ای با سرعت بالا برای Manipulation داده و مکملی کامل برای قدرت شناختی هوش مصنوعی عمل می‌کند. این بخش، رابطه پویا میان grep و هوش مصنوعی را بررسی می‌کند و برجسته می‌سازد که چگونه این دستورِ چند دهه‌ای، هم فناوری پیشرفته را تقویت می‌کند و هم توسط آن تقویت می‌شود.

مدیریت عبارات باقاعده با کمک هوش مصنوعی

تسلط بر سینتکس عبارات باقاعده همیشه مانعی چشمگیر برای توسعه‌دهندگان بوده است. الگوهای پیچیده می‌توانند به‌طور بدنامی برای نوشتن دشوار و برای رمزگشایی دشوارتر باشند. دستیارهای هوش مصنوعی مدرن، پلی قدرتمند می‌سازند تا قدرت کامل Regex برای همه قابل دسترس شود.

  • تولید Regex با هوش مصنوعی: تصور کنید لازم است یک نام کاربری را طبق مجموعه‌ای از قوانین پیچیده اعتبارسنجی کنید: باید ۸ تا ۱۶ کاراکتر باشد، با یک حرف شروع شود، حداقل یک عدد داشته باشد و زیرخط (Underscore) را مجاز بداند اما نه در ابتدا یا انتها. ساخت این Regex با دست، فرایندی دقت‌بر و خطاخیز است. با دستیار هوش مصنوعی مثل GitHub Copilot یا ChatGPT، می‌توانید این الزامات را به سادگی به زبان طبیعی توصیف کنید. هوش مصنوعی، منظورتان را به الگویی دقیق و کارآمد ترجمه می‌کند؛ اغلب با نسخه‌ای سازگار با نوع Regex خاصِ grep. این کار، وظیفه را از یک پازل خسته‌کننده به یک تبادل گفتگوی ساده تبدیل می‌کند.
  • هوش مصنوعی برای توضیح‌پذیری Regex: رایج‌تر از آن، به ارث‌بردن اسکریپتی است که Regex رمزآلودی مثل ‏^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$ را در بر دارد. در نگاه اول، این تقریباً غیرقابل خواندن است. به‌جای صرف یک ساعت برای رمزگشایی دقیقش، می‌توانید آن را در یک ابزار هوش مصنوعی Paste کرده و توضیح بخواهید. هوش مصنوعی مثل یک مترجم عمل کرده و آن را تکه‌تکه تجزیه می‌کند: «‏(?=.*[a-z]) یک Lookahead مثبت است که وجود حداقل یک حرف کوچک را تضمین می‌کند…». این قابلیت برای دیباگ، بازآرایی (Refactor) کدهای قدیمی و تسریع فرایند یادگیری برای توسعه‌دهندگان تازه‌کار ارزشمند است.

نقش grep در هوش مصنوعی و یادگیری ماشین

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

  • پیش‌پردازش و پاک‌سازی داده: چالش آماده‌سازی یک مجموعه داده متنی ۵۰ گیگابایتی برای آموزش یک مدل زبان طبیعی را در نظر بگیرید. این داده خامِ خراشیده‌شده از وب، ناگزیر کثیف است. ممکن است حاوی تگ‌های باقی‌مانده HTML، قطعات JSON بدشکل یا خطوطی با کاراکترهای غیر UTF-8 باشد. اجرای یک اسکریپت حساس Python روی این فایل خام، ناکارآمد و پرخطر است — یک خطِ بد می‌تواند کل فرایند را زمین بزند. grep خط مقدمِ مقاوم و خطاخورِ خوبی فراهم می‌کند. می‌توانید از آن در یک خط لوله برای انجام وظایف پاک‌سازی حیاتی با سرعت شگفت‌انگیز استفاده کنید:
    • ایزوله‌کردن داده مرتبط: grep '"text":' فقط خطوط حاوی فیلد داده موردنظر را استخراج می‌کند.
    • حذف خطوط بدشکل: grep -v "<!DOCTYPE html>" به‌سرعت هر سند HTML آلوده‌کننده را حذف می‌کند.
    • فیلتر بر اساس معیار: ‏grep -E "\b(error|failed|exception)\b" می‌تواند یک مجموعه داده کوچک‌تر و متمرکزِ متونِ مرتبط با خطا برای آموزش مدل تخصصی بسازد.

با استفاده از grep برای این فیلترکردن اولیه و پرحجم، منابع محاسباتی ارزشمندی ذخیره کرده و تضمین می‌کنید ابزارهای بعدی AI/ML مجموعه داده‌ای تمیز و خوش‌ساختار دریافت کنند تا کارآمدتر و مؤثرتر عمل کنند.

مقایسه زمینه‌ای: grep در برابر ابزارهای مدرن هوش مصنوعی

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

جدول زیر مقایسه دقیق‌تری فراهم می‌کند:

ویژگیgrepابزارهای مبتنی بر AI (مثلاً Sourcegraph و Copilot)
روش جست‌وجوتطبیق متنیِ لفظی و مبتنی بر الگو. توالی‌های کاراکتر را پیدا می‌کند.جست‌وجوی معنایی، زمینه‌ای و مفهومی. معنا و روابط را پیدا می‌کند.
آگاهیخط‌محور. هیچ درکی از سینتکس کد، Scope یا ساختار ندارد.کدآگاه. توابع، کلاس‌ها، Scope متغیرها و وابستگی‌ها را درک می‌کند.
سوال اصلی«آیا این رشته یا الگوی دقیق در این فایل وجود دارد؟»«این مفهوم در کجای کدبیس پیاده‌سازی شده است؟»
سرعتبرای الگوهای شناخته‌شده فوق‌العاده سریع. برای پردازش خام متن بهینه شده.کندتر؛ اما می‌تواند کوئری‌های پیچیده و انتزاعی‌ای انجام دهد که grep نمی‌تواند.
فراگیریجهانی. به‌صورت پیش‌فرض روی تقریباً هر سیستم شبه‌یونیکسی در دسترس است.وابسته به پلتفرم. نیازمند نصب، پیکربندی و اغلب اتصال شبکه.
  • جست‌وجوی کد: اگر لازم است هر رخدادِ نام تابع getUserById را پیدا کنید، ‏grep -r "getUserById" ابزار کاملی است. اما اگر لازم است همه جاهایی را در یک کدبیس بزرگ که بازنشانی رمز عبور کاربر را هندل می‌کنند پیدا کنید چه؟ توابع مرتبط ممکن است resetUserPassword یا updateCredentials یا handleAuthTokenInvalidation نام داشته باشند. grep ایجاب می‌کرد همه حالت‌های ممکن را بدانید و جست‌وجو کنید. یک ابزار مبتنی بر هوش مصنوعی مفهومِ بازنشانی رمز عبور را درک می‌کند. می‌توانید از آن بپرسید «توابع مرتبط با بازنشانی رمز عبور را به من نشان بده» و همه بلوک‌های کد مرتبط را — فارغ از نام‌های مشخصشان — شناسایی می‌کند.
  • تحلیل لاگ: استفاده از grep "FATAL" برای یافتن خطاهای بحرانی در یک فایل لاگ، وظیفه روزانه بسیاری از مهندسان است. برای یافتن مشکلاتِ شناخته‌شده سریع و مؤثر است. با این حال، یک مسئله مضرتر را در نظر بگیرید: نشت حافظه ظریفی که کارایی سیستم را طی چند روز تنزل می‌دهد. هیچ خطِ «ERROR» منفردی وجود ندارد. مشکل داخل الگویی از هزاران ورودی لاگِ به‌ظاهر عادی پنهان است. اینجاست که پلتفرم‌های تحلیل لاگِ مبتنی بر هوش مصنوعی عالی‌اند. آن‌ها می‌توانند ترابایت‌ها داده لاگ را دریافت کرده و ناهنجاری‌های آماری را تشخیص بدهند؛ و مشخص کنند که یک توالی مشخص از رویدادها — درحالی‌که خودش خطا نیست — با افزایش مصرف حافظه همبستگی دارد. grep به شما کمک می‌کند سوزن‌هایی را که می‌دانید در انبار کاه هستند پیدا کنید؛ هوش مصنوعی به شما کمک می‌کند سوزن‌هایی را کشف کنید که هرگز نمی‌دانستید وجود دارند.

خطاهای رایج و عیب‌یابی

۱. استفاده از عملگرهای Regex مثل * و + یا ? بدون Escape کردن آن‌ها

هنگام استفاده از عملگرهای Regex مثل * و + یا ?، ضروری است آن‌ها را به‌درستی Escape کنید تا از تطبیق‌های غیرمنتظره اجتناب شود. مثلاً، اگر می‌خواهید با کاراکتر لفظی * تطبیق بدهید، باید آن را با بک‌اسلش Escape کنید (‏*). به‌طور مشابه، برای تطبیق کاراکترهای لفظی + یا ?، آن‌ها را با بک‌اسلش Escape کنید (‏+ یا ?).

دستور نمونه برای تطبیق یک کاراکتر لفظی *:

grep -E "a\*" yourfile.txt

۲. تطبیق خطوط خالی یا خطوطی با فقط فاصله سفید

برای تطبیق خطوط خالی یا خطوطی با فقط کاراکترهای فاصله سفید، می‌توانید از الگوی Regex زیر استفاده کنید:

grep -E "^\s*$" yourfile.txt

این الگو با خطوطی مطابقت می‌کند که با شروع (^) و پایان ($) و فقط کاراکترهای فاصله سفید (‏\s*) هستند.

۳. جست‌وجوی Tabها (‏\t) و Carriage Returnها (‏\r)

برای تطبیق Tabها (‏\t) یا Carriage Returnها (‏\r) در متن‌تان، می‌توانید از این دستورات استفاده کنید:

# تطبیق خطوط حاوی Tab
grep -E "\t" yourfile.txt

# تطبیق خطوط حاوی Carriage Return
grep -E "\r" yourfile.txt

توجه کنید که در برخی موارد، ممکن است لازم باشد از گزینه E- برای فعال‌کردن الگوهای Regex گسترده استفاده کنید؛ که به شما اجازه استفاده از قابلیت‌های پیشرفته‌تر Regex را می‌دهد.

تفاوت‌های grep و egrep و fgrep

دستورتوضیحقابلیت‌هاموارد استفادهدستور نمونه
grepتطبیق الگوی پایهاز Regex پایه پشتیبانی می‌کندتطبیق الگوی عمومیgrep "pattern" file.txt
egrepتطبیق الگوی گستردهاز Regex گسترده پشتیبانی می‌کندتطبیق الگوی پیچیدهegrep "pattern" file.txt
fgrepتطبیق الگوی ثابتبدون پشتیبانی Regexتطبیق رشته‌های ثابتfgrep "pattern" file.txt

توجه: تفاوت اصلی این دستورات، نوع تطبیق الگویی است که پشتیبانی می‌کنند. grep از Regex پایه، egrep از Regex گسترده و fgrep اصلاً از Regex پشتیبانی نمی‌کند.

مدیریت الگوهای چندخطی

grep به دلیل ماهیت خط‌محورش، برای هندل الگوهای چندخطی مناسب نیست. با این حال، ابزارهای جایگزینی وجود دارند که می‌توانند به‌طور مؤثر چنین الگوهایی را هندل کنند. awk و perl دو گزینه محبوب‌اند که می‌توان از آن‌ها برای جست‌وجوی الگوهایی که چند خط را در بر می‌گیرند استفاده کرد.

awk یک ابزار قدرتمند پردازش متن است که می‌تواند برای تطبیق الگوها در چند خط استفاده شود. به شما اجازه می‌دهد الگویی برای تطبیق تعریف کرده و سپس روی خطوط تطبیق‌یافته اقداماتی انجام دهید. مثلاً، برای یافتن خطوطی که یک الگو را در چند خط دارند، از این دستور استفاده کنید:

awk '/pattern/ {print $0}' yourfile.txt

این دستور همه خطوطی را که با الگوی مشخص‌شده مطابقت دارند چاپ می‌کند. توجه کنید که awk همچنین می‌تواند عملیات پیچیده‌تری روی خطوط تطبیق‌یافته انجام دهد؛ مثل چاپ کل بلوک متنی که با الگو مطابقت دارد.

perl ابزار قدرتمند دیگری است که می‌توان برای هندل الگوهای چندخطی استفاده کرد. این ابزار روشی منعطف‌تر و بیانگرتر برای تطبیق الگوها با موتور عبارت باقاعده داخلی‌اش فراهم می‌کند. مثلاً، می‌توانید از این دستور برای یافتن خطوطی که یک الگو را در چند خط دارند استفاده کنید:

perl -0777 -ne 'print if /pattern/s' yourfile.txt

این دستور به perl می‌گوید فایل را در حالت «Slurp» (‏-0777) بخواند؛ که به آن اجازه می‌دهد کل فایل را یک‌جا در حافظه بخواند. گزینه ne- تعیین می‌کند اسکریپت برای هر خط فایل اجرا شود. عبارت print if /pattern/s الگو را در چند خط (به دلیل اصلاح‌گر s) تطبیق داده و کل بلوک متنیِ تطبیق‌یافته را چاپ می‌کند.

هم awk و هم perl در هندل الگوهای چندخطی، قابلیت‌ها و انعطاف بیشتری از grep ارائه می‌دهند و برای چنین وظایفی، جایگزین‌های ایده‌آلی هستند.

سوالات متداول

۱. تفاوت grep و egrep چیست؟

grep و egrep هر دو برای تطبیق الگو استفاده می‌شوند؛ اما در نوع الگوهایی که پشتیبانی می‌کنند تفاوت دارند. grep از عبارات باقاعده پایه پشتیبانی می‌کند؛ درحالی‌که egrep از عبارات باقاعده گسترده پشتیبانی می‌کند که تطبیق الگوی پیشرفته‌تری را ممکن می‌سازند.

۲. آیا می‌توانم از grep برای جست‌وجو در چند فایل استفاده کنم؟

بله؛ می‌توانید با تعیین چند نام فایل یا استفاده از Wildcard، از grep برای جست‌وجو در چند فایل استفاده کنید. مثلاً:

grep "pattern" file1.txt file2.txt

یا:

grep "pattern" *.txt

۳. چطور با grep خطوطی را پیدا کنم که با یک الگو مطابقت ندارند؟

برای یافتن خطوطی که با یک الگو مطابقت ندارند، از گزینه v- استفاده کنید. مثلاً:

grep -v "pattern" yourfile.txt

این همه خطوطی را که الگوی مشخص‌شده را ندارند چاپ می‌کند.

۴. چطور شماره خطوط را در خروجی grep بگنجانم؟

برای گنجاندن شماره خطوط در خروجی grep، از گزینه n- استفاده کنید. مثلاً:

grep -n "pattern" yourfile.txt

این شماره خطوط را به‌همراه خطوطی که با الگوی مشخص‌شده مطابقت دارند چاپ می‌کند.

۵. چرا Regex مربوط به grep من همان‌طور که انتظار دارم کار نمی‌کند؟

چند دلیل ممکن است وجود داشته باشد که Regex شما طبق انتظار کار نمی‌کند. چند مسئله رایج برای بررسی:

  • مطمئن شوید از سینتکس درست برای الگوی Regex خود استفاده می‌کنید.
  • اطمینان حاصل کنید که گزینه‌های درست را برای دستور grep استفاده می‌کنید (مثلاً E- برای Regex گسترده).
  • بررسی کنید که الگوی شما شامل کاراکترهای خاصی است که باید Escape شوند.
  • تأیید کنید که الگوی شما به‌درستی Quote شده تا از تفسیر توسط شل اجتناب شود.

۶. چطور به‌دنبال الگویی بگردم که فاصله سفید یا کاراکترهای خاص دارد؟

برای جست‌وجوی الگویی که فاصله سفید یا کاراکترهای خاص دارد، باید این کاراکترها را در الگوی Regex خود به‌درستی Escape کنید. مثلاً، برای جست‌وجوی الگویی که فاصله سفید دارد، از این دستور استفاده کنید:

grep "pattern\ with\ whitespace" yourfile.txt

به‌طور مشابه، برای جست‌وجوی الگویی که کاراکترهای خاص دارد، آن‌ها را با بک‌اسلش (‏) Escape کنید. مثلاً:

grep "pattern\ with\ special\ characters" yourfile.txt

جمع‌بندی

در این آموزش، از جست‌وجوهای ساده کلیدواژه‌ای فراتر رفته و grep را به‌عنوان ابزاری قدرتمند برای پردازش متن به خدمت گرفتید. با تطبیق لفظی پایه و گزینه‌های رایج خط فرمان شروع کردید؛ سپس از خلال varianteهای مختلف عبارات باقاعده — مانند پایه (BRE) و گسترده (ERE) — تا الگوهای پیشرفته موجود در عبارات باقاعده سازگار با پرل (PCRE) پیش رفتید. با کاوش سناریوهای واقعی مثل فیلترکردن لاگ‌ها، اسکن کد منبع و آماده‌سازی داده برای گردش کارهای هوش مصنوعی، دیدید که grep چگونه همچنان ابزاری ضروری در هر جعبه‌ابزار مدرنی باقی می‌ماند.

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

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا