שימוש ב-Grep ובביטויים רגולריים לחיפוש של תבניות טקסט ב-Linux

הקדמה

פקודת grep היא אחת מהפקודות המועילות ביותר בסביבת טרמינל של Linux. שם הפקודה grep מסמל "global regular expression print". זה אומר שתוכל להשתמש ב־grep כדי לבדוק האם הקלט שהוא מקבל תואם תבנית מסוימת. התוכנית הזו שמתחזית נראית פשוטה מאוד היא חזקה ביותר; יכולתה למיין קלט על פי כללים מורכבים הופכת אותה לקישור פופולרי בשרשראות הפקודות הרבות.

במדריך זה, תלמד על אפשרויות הפקודה grep, ואז תתעמק בשימוש בביטויים רגולריים כדי לבצע חיפושים מתקדמים יותר.

דרישות מוקדמות

כדי להמשיך עם המדריך הזה, תצטרך גישה למחשב שרץ במערכת הפעלה מבוססת Linux. זה יכול להיות או שרת פרטי וירטואלי שהתחברת אליו באמצעות SSH או המחשב המקומי שלך. שים לב שהמדריך זה עבר אימות בשימוש בשרת Linux הרץ ב־Ubuntu 20.04, אך הדוגמאות שניתנות אמורות לעבוד על מחשב הרץ בגרסת כל מפצל Linux שהיא.

אם אתה מתכנן להשתמש בשרת רחוק למעקב אחרי המדריך הזה, אנו ממליצים לך לסיים תחילה את מדריך התקנת השרת הראשוני שלנו. לעשות זאת יכול להכין לך סביבת שרת מאובטחת — כולל משתמש לא-root עם הרשאות sudo וגישה לגיבוי של UFW — שתוכל להשתמש בה כדי לבנות את הכישורים שלך ב-Linux.

שימוש בסיסי

במדריך זה, תשתמש ב-grep כדי לחפש ברישיון ה-רשיון כללי ציבורי של GNU גרסה 3 מילים וביטויים שונים.

אם אתה במערכת Ubuntu, תוכל למצוא את הקובץ בתיקיית /usr/share/common-licenses. העתק אותו אל תיקיית הבית שלך:

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

אם אתה במערכת אחרת, השתמש בפקודת curl כדי להוריד עותק:

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

תשתמש גם בקובץ רשיון BSD במדריך זה. על Linux, תוכל להעתיק את זה אל תיקיית הבית שלך עם הפקודה הבאה:

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

אם אתה במערכת אחרת, צור את הקובץ עם הפקודה הבאה:

  1. cat << 'EOF' > BSD
  2. Copyright (c) The Regents of the University of California.
  3. All rights reserved.
  4. Redistribution and use in source and binary forms, with or without
  5. modification, are permitted provided that the following conditions
  6. are met:
  7. 1. Redistributions of source code must retain the above copyright
  8. notice, this list of conditions and the following disclaimer.
  9. 2. Redistributions in binary form must reproduce the above copyright
  10. notice, this list of conditions and the following disclaimer in the
  11. documentation and/or other materials provided with the distribution.
  12. 3. Neither the name of the University nor the names of its contributors
  13. may be used to endorse or promote products derived from this software
  14. without specific prior written permission.
  15. THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  16. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  17. IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  18. ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  19. FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  20. DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  21. OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  22. HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  23. LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  24. OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  25. SUCH DAMAGE.
  26. EOF

עכשיו שיש לך את הקבצים, תוכל להתחיל לעבוד עם grep.

בצורה הבסיסית ביותר, תשתמש ב-grep כדי להתאים רקע לתבניות במסמך טקסט. זה אומר שאם תעביר ל-grep מילה לחיפוש, הוא ידפיס כל שורה בקובץ המכילה את המילה הזו.

הרץ את הפקודה הבאה כדי להשתמש ב־grep לחיפוש כל שורה שמכילה את המילה GNU:

  1. grep "GNU" GPL-3

הפרמטר הראשון, GNU, הוא התבנית שאתה מחפש, בעוד הפרמטר השני, GPL-3, הוא קובץ הקלט שברצונך לחפש בו.

הפלט התוצאה יהיה כל שורה המכילה את טקסט התבנית:

Output
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 (באותיות גדולות, קטנות, או מעורבות) באותו הקובץ כמו לפני עם הפקודה הבאה:

  1. grep -i "license" GPL-3

התוצאות כוללות: LICENSE, license, ו־License:

Output
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 עם הפקודה הבאה:

  1. grep -v "the" BSD

תקבל את הפלט הבא:

Output
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. הפעל מחדש את הדוגמה הקודמת עם האופציה הזו מוסיפה:

  1. grep -vn "the" BSD

זה יחזיר את הטקסט הבא:

Output
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 מסמנת "הדפסת ביטויים רגולריים גלובלית". "ביטוי רגולרי" הוא מחרוזת טקסט המתארת דפוס חיפוש מסוים.

יישומים שונים ושפות תכנות מיישמים ביטויים רגולריים בצורה מעט שונה. במדריך זה תגלה רק תת־קבוצה קטנה מהדרך שבה grep מתארת את הדפוסים שלו.

התאמות ליטרליות

בדוגמאות הקודמות במדריך זה, כאשר חיפשת למילים GNU ו־the, אתה בעצם מחפש עבור ביטויים רגולריים בסיסיים שמתאימים למחרוזת מדויקת של תווים GNU ו־the. תבניות שמציין בדיוק את התווים שיש להתאים נקראות "ליטרליות" מכיוון שהן מתאימות לתבנית באופן לטרלי, תו אחר תו.

מועיל לחשוב על אלו כמתאימים למחרוזת של תווים במקום מתאימים למילה. זה יהפוך להבדיל חשוב יותר ככל שתלמד תבניות מורכבות יותר.

כל התווים האלפביתיים והמספריים (וגם תווים מסוימים אחרים) מתאימים ליטרלית אלא אם כן מודיפים על ידי מנגנוני ביטויים אחרים.

התאמות לעוגנים

עוגנים הם תווים מיוחדים שמציינים איפה בשורה חייבת להתרחש ההתאמה כדי שתהיה תקפה.

לדוגמה, באמצעות עוגנים, תוכל לציין כי אתה רוצה רק לדעת על השורות שמתאימות ל־GNU בתחילת השורה בדיוק. כדי לעשות זאת, תוכל להשתמש בעוגן ^ לפני המחרוזת הליטרלית.

הריץ את הפקודה הבאה כדי לחפש את הקובץ GPL-3 ולמצוא שורות בהן מופיעה המילה GNU בתחילתן של השורה:

  1. grep "^GNU" GPL-3

פקודה זו תחזיר את השורות הבאות:

Output
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:

  1. grep "and$" GPL-3

תקבלו את הפלט הבא:

Output
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, יש להשתמש בתבנית הבאה:

  1. grep "..cept" GPL-3

פקודה זו תחזיר את הפלט הבא:

Output
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 והשינויים שלהן. התבנית גם הייתה מתאימה ל-z2cept אם הייתה מופיעה כך גם.

ביטויי סוגריים

על ידי שימוש בסוגריים מרובעים (\[ ו־\]), ניתן לציין כי התו במיקום זה יכול להיות כל תו אחד הנמצא בתוך קבוצת הסוגריים.

לדוגמה, כדי למצוא את השורות המכילות את too או two, תציין את הופעות אלו בצורה קצרה באמצעות התבנית הבאה:

  1. grep "t[wo]o" GPL-3

הפלט מציין כי שני השונויות קיימות בקובץ:

Output
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:

  1. grep "[^c]ode" GPL-3

להלן הפלט שתקבלו:

Output
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, נמצאה. השורה חזרה מאחר והיה קיים אינסטנס שתואם את התבנית.

תכונה נוספת שימושית של סוגריים היא שתוכל לציין טווח של תווים במקום להקליד כל תו נתון בנפרד.

כלומר, אם ברצונך למצוא כל שורה שמתחילה באות גדולה, תוכל להשתמש בתבנית הבאה:

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

הנה הפלט שהביטוי הזה מחזיר:

Output
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:\] בתוך בורר סוגריים:

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

הפלט יהיה זהה לקודם.

חזור על הדפוס פעמים אפס או יותר

לבסוף, אחד מהתווים המטא-נפוצים ביותר הוא הכוכבית, או *, שמשמעו "חזור על התו או הביטוי הקודם אפס או יותר פעמים".

כדי למצוא כל שורה בקובץ GPL-3 שמכילה פתיחה וסגירה של סוגריים, עם אותיות בודדות ורווחים ביניהם, השתמש בביטוי הבא:

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

תקבל את הפלט הבא:

Output
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 ... ...

עד כה השתמשת בנקודות, כוכביות ותווים אחרים בביטויים שלך, אך לעיתים תצטרך לחפש את התווים האלה באופן מפורש.

שחרור תווים מטא

ישנם רגעים בהם תצטרך לחפש לסימן נקודה ממשי או לסימן פתיחתי ממש, במיוחד כאשר אתה עובד עם קוד מקור או קבצי הגדרות. מכיוון שתווים אלה יש להם משמעות מיוחדת בביטויים רגולריים, עליך ל"ברח" את תווים אלה כדי להגיד ל־grep שאינך רוצה להשתמש במשמעות המיוחדת שלהם במקרה זה.

אתה מבריח תווים באמצעות שימוש בתו החזרה (\) לפני התו שבדרך כלל יש לו משמעות מיוחדת.

לדוגמה, כדי למצוא כל שורה שמתחילה באות גדולה ומסתיימת בנקודה, השתמש בביטוי הבא שמבריח את הנקודה הסופית כך שהיא מייצגת נקודה ממשית במקום משמעות "כל תו":

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

זהו הפלט שתראה:

Output
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.

אפשרויות אלו פותחות את היכולות של "ביטויים רגולריים מורחבים". ביטויים רגולריים מורחבים כוללים את כל המתווים הבסיסיים, יחד עם מתווים נוספים כדי להביע התאמות מורכבות יותר.

קיבוץ

אחת היכולות המועילות ביותר שפתיחת הביטויים הרגולריים המורחבת פותחת היא היכולת לקבוץ ביטויים יחד כדי לנהל אותם או להפנות אליהם כיחידה אחת.

כדי לקבץ ביטויים יחד, עליך לעטוף אותם בסוגריים. אם ברצונך להשתמש בסוגריים מבלי להשתמש בביטויים רגולריים מורחבים, ניתן להתיר אותם באמצעות סימן החזרה אחורה כדי להפעיל את פונקציונליות זו. זה אומר ששלושת הביטויים הבאים זהים פונקציונלית:

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

אלטרנטיבה

בדומה לאיך שביטויי סוגריים יכולים לציין בחירות אפשריות שונות להתאמות תווים יחידים, אלטרנטיבה מאפשרת לך לציין התאמות אלטרנטיביות למחרוזות או לסטי ביטויים.

כדי לציין אלטרנטיבה, עליך להשתמש בתו הצינור |. נהוג להשתמש בסוגריים לציון שאחד משני או יותר מבחרים צפויים כמחזור.

הבא ימצא את GPL או רישיון ציבורי כללי בטקסט:

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

הפלט נראה כך:

Output
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 ... ...

אלטרנטיבה יכולה לבחור בין יותר משתי בחירות על ידי הוספת בחירות נוספות בתוך קבוצת הבחירה מופרדות בתו צינור (|).

כמותיים

כמו המטא-תו * שתואם את התו או סט התווים הקודם אפס או יותר פעמים, יש מטא-תוים אחרים זמינים בביטויים רגולריים מורחבים שמציינים את מספר ההופעות.

כדי להתאים לתו פעם אפס או פעם אחת, ניתן להשתמש בתו ?. זה עושה את התו או סט התווים שהקדים אופציונלי, בעצם.

הבא מתאים ל- copyright ול- right על ידי שימוש בתת-קבוצה אופציונלית של copy:

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

תקבלו פלט זה:

Output
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 פלוס תווים שאינם תווי רווח:

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

תראו פלט זה:

Output
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. freedomss 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 שמכילות שלושה תווי ניקוד:

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

כל שורה שתוחזר תכיל מילה עם שלושה תווי ניקוד:

Output
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

כדי להתאים למילים שיש להן בין 16 ל־20 תווים, השתמש בביטוי הבא:

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

כאן הואפט פלט הפקודה:

Output
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

רק שורות המכילות מילים באורך המתאים מוצגות.

מסקנה

grep שימושי למציאת תבניות בתוך קבצים או בתוך היררכיית מערכת הקבצים, לכן שווה להוציא זמן ולהתרגל לאפשרויותיו ולתחבירתו.

ביטויים רגולריים הם אפילו יותר גמישים, וניתן להשתמש בהם עם הרבה תוכנות פופולריות. לדוגמה, רבות מערכות העריכה של טקסט מיישמות ביטויים רגולריים לחיפוש והחלפת טקסט.

בנוסף, רוב שפות התכנות המודרניות משתמשות בביטויים רגולריים כדי לבצע פעולות על קטעי נתונים מסוימים. לאחר שתבין ביטויים רגולריים, תוכל להעביר את הידע הזה למגוון משימות מחשביות נפוצות, מביצוע חיפושים מתקדמים בעורך הטקסט שלך עד לאימות קלט משתמש.

Source:
https://www.digitalocean.com/community/tutorials/using-grep-regular-expressions-to-search-for-text-patterns-in-linux