שימושים לדוגמה בפקודה Linux grep

הפקודה Linux grep משמשת כשיטה לסינון קלט. GREP ראשי תיבות של Global Regular Expression Printer ולכן על מנת להשתמש בו ביעילות, עליך להיות בעל ידע מסוים על ביטויים רגולריים.

במאמר זה תלמדו מספר דוגמאות שיעזרו לכם להבין את פקודת grep.

כיצד לחפש מחרוזת בקובץ באמצעות GREP

צילום המסך הידני של Linux grep Command

תאר לעצמך שיש לך קובץ טקסט בשם ספרים עם כותרות ספרי הילדים הבאות:

  • רובין הוד
  • כיפה אדומה
  • פיטר פן
  • זהבה ושלושת הדובים
  • שלגיה ושבעת הגמדים
  • פינוצ'יו
  • החתול בכובע
  • שלושת החזירים הקטנים
  • הגרופלו
  • צ'רלי ומפעל השוקולד

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

grep הספרים. 

התוצאות הבאות יוחזרו:

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

בכל מקרה, המילה "ה" תודגש.

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

כדי להתעלם מהמקרה תוכל להוסיף את המתג הבא:

grep the books --ignore-case. 

אתה יכול גם להשתמש במתג -i באופן הבא:

grep -i הספרים. 

חפש מחרוזת בקובץ באמצעות ביטויים רגולריים

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

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

תאר לעצמך שיש לך קובץ בשם מקומות עם שמות המקומות הסקוטיים הבאים:

אברדין
Aberystwyth
אברלור
inverurie
אינברנס
ניובורג
צבי חדש
גאלוווי חדשה
גלזגו
אדינבורג.

אם אתה רוצה למצוא את כל המקומות עם inver בשם, השתמש בתחביר הבא:

grep inver* מקומות. 

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

בדוגמה למעלה, זה תואם:

inverurie
אינברנס.

מכיוון ששניהם מכילים את התבנית "inver" כפי שהוכנסה בתוספת אפס חזרות נוספות של התבנית הזו. כדי לראות זאת שוב בצורה ברורה יותר, הוסף:

repeatinverinverinver. 

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

grep inver* מקומות.

אתה רואה את הקו החדש? זה לא יעבוד בבאש, אבל זה כן כאן.

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

grep inver places. 

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

תו כללי נוסף שאתה יכול להשתמש בו הוא התקופה (.). אתה יכול להשתמש בזה כדי להתאים אות בודדת.

grep inver.r מקומות. 

הפקודה שלעיל תמצא מקומות שנקראים inverurie ו-inverary אבל לא תמצא invereerie כי יכול להיות רק תו כללי אחד בין שני ה-r כפי שמסומן על ידי התקופה הבודדת.

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

לדוגמה, עיין ברשימה זו של שמות מתחם.

  • linux.lifewire.com
  • pcsupport.lifewire.com
  • mp3.lifewire.com
  • minecraft.lifewire.com
  • androidgames.lifewire.com
  • netforbeginners.lifewire.com
  • everydaylinuxuser.com
  • google.co.uk
  • google.au
  • direct.gov.uk
  • fakesite.lifewire1com.com

כדי למצוא את כל כתובות האתרים של lifewire.com אתה יכול פשוט לחפש באמצעות התחביר הבא:

grep .com שמות מתחם. 

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

everydaylinuxuser.com. 

לכן, אתה יכול לנסות את התחביר הבא:

grep שמות דומיינים של lifewire.com. 

זה יעבוד בסדר אלא אם כן יש דומיין עם השם הבא:

fakesite.lifewire1com.com. 

כדי לחפש באמת את המונח lifewire.com תצטרך לברוח מהנקודה באופן הבא:

grep lifewire\\.com שמות דומיינים. 

התו הכללי האחרון להראות לך הוא סימן השאלה המייצג אפס או תו אחד.

לדוגמה:

grep -E ?ber שמות מקומות. 

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

חפש מחרוזות בתחילת ובסוף שורה באמצעות grep

הקראט (^) וסמל הדולר ($) מאפשרים לך לחפש תבניות בתחילת השורות ובסוףן.

תאר לעצמך שיש לך קובץ בשם כדורגל עם שמות הקבוצות הבאים:

  • בלקפול
  • ליברפול
  • מנצ'סטר סיטי
  • לסטר סיטי
  • מנצ'סטר יונייטד
  • ניוקאסל יונייטד
  • FC יונייטד של מנצ'סטר

אם תרצה למצוא את כל הקבוצות שהתחילו עם מנצ'סטר, היית משתמש בתחביר הבא:

grep ^צוותי מנצ'סטר. 

הפקודה לעיל תחזיר את מנצ'סטר סיטי ומנצ'סטר יונייטד אך לא את FC יונייטד של מנצ'סטר.

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

grep United$ teams. 

הפקודה לעיל תחזור למנצ'סטר יונייטד ולניוקאסל יונייטד אך לא ל-FC United Of Manchester.

ספירת מספר ההתאמות באמצעות grep

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

קובץ קלט דפוס grep -c. 

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

מציאת כל המונחים שאינם תואמים באמצעות grep

תאר לעצמך שיש לך רשימה של שמות מקומות עם המדינות הרשומות כדלקמן:

  • אברדין סקוטלנד
  • גלסגו סקוטלנד
  • ליברפול אנגליה
  • קולווין ביי
  • לונדון, אנגליה

אולי שמתם לב שלמפרץ קולווין אין מדינה הקשורה אליו.

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

grep land$ מקומות. 

החזרות התוצאות יהיו בכל המקומות מלבד קולווין ביי.

זה כמובן עובד רק עבור מקומות שנגמרים ביבשה (בקושי מדעיים).

אתה יכול להפוך את הבחירה באמצעות התחביר הבא:

grep -v land$ מקומות. 

זה ימצא את כל המקומות שלא נגמרו באדמה.

כיצד למצוא שורות ריקות בקבצים באמצעות grep

תאר לעצמך שיש לך קובץ קלט המשמש יישום של צד שלישי שמפסיק לקרוא את הקובץ כאשר הוא מוצא שורה ריקה באופן הבא:

  • אברדין סקוטלנד
  • אינברנס סקוטלנד
  • ליברפול אנגליה
  • קולווין ביי ווילס

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

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

grep ^$ מקומות. 

זה לא שימושי במיוחד מכיוון שהוא רק מחזיר את השורות הריקות.

אתה יכול, כמובן, לקבל ספירה של מספר השורות הריקות כבדיקה כדי לראות אם הקובץ חוקי באופן הבא:

grep -c ^$ מקומות. 

עם זאת, יהיה שימושי יותר לדעת את מספרי השורות שיש להם שורה ריקה כדי שתוכל להחליף אותם. אתה יכול לעשות את זה עם הפקודה הבאה:

grep -n ^$ מקומות. 

כיצד לחפש מחרוזות של אותיות רישיות או קטנות באמצעות grep

באמצעות grep אתה יכול לקבוע לאילו שורות בקובץ יש תווים רישיות באמצעות התחביר הבא:

grep '[A-Z]' שם הקובץ. 

הסוגריים המרובעים [] מאפשרים לך לקבוע את טווח התווים. בדוגמה שלמעלה, הוא מתאים לכל תו שנמצא בין A ל-Z.

לכן כדי להתאים תווים קטנים, אתה יכול להשתמש בתחביר הבא:

grep '[a-z]' שם הקובץ. 

אם אתה רוצה להתאים רק אותיות ולא מספרים או סמלים אחרים, אתה יכול להשתמש בתחביר הבא:

grep '[a-zA-Z]' שם הקובץ. 

אתה יכול לעשות את אותו הדבר עם מספרים באופן הבא:

grep '[0-9]' שם הקובץ. 

מחפש תבניות חוזרות באמצעות grep

אתה יכול להשתמש בסוגריים מסולסלים {} כדי לחפש דפוס חוזר.

תאר לעצמך שיש לך קובץ עם מספרי טלפון כדלקמן:

  • 055-1234
  • 055-4567
  • 555-1545
  • 444-0167
  • 444-0854
  • 4549-2234
  • x44-1234

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

מהדוגמה הקודמת, אתה יודע ש-[0-9] מחזיר את כל המספרים בקובץ.

במקרה זה, אנו רוצים את השורות שמתחילות בשלושה מספרים ואחריהם מקף (-). אתה יכול לעשות זאת עם התחביר הבא:

grep "^[0-9][0-9][0-9]-" מספרים. 

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

ה-[0-9] יחפש כל מספר בין 0 ל-9. מכיוון שזה כלול שלוש פעמים הוא תואם ל-3 מספרים. לבסוף, יש מקף שמציין שמקף חייב לחלוף על שלושת המספרים.

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

grep "^[0-9]\{3\}-" מספרים. 

הלוכסן בורח מהסוגר { כך שהוא יפעל כחלק מהביטוי הרגולרי, אבל בעצם מה שזה אומר הוא [0-9]{3} שפירושו כל מספר בין 0 ל-9 שלוש פעמים.

ניתן להשתמש בסוגריים המתולתלים גם באופן הבא:

{5,10}
{5,}

ה-{5,10} אומר שיש לחזור על התו שמחפשים לפחות 5 פעמים אך לא יותר מ 10 ואילו ה-{5,} אומר שצריך לחזור על התו לפחות 5 פעמים אבל הוא יכול להיות יותר מ זֶה.

שימוש בפקודות אחרות באמצעות grep

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

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

לדוגמה, הפעל את הפקודה הבאה:

ps -ef. 

כל התהליכים הפועלים במערכת שלך יוצגו.

אתה יכול להשתמש ב-grep כדי לחפש תהליך רץ מסוים באופן הבא:

ps -ef | grep firefox. 

סיכום

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