תחי ישראל - אין לנו ארץ אחרת

תחי ישראל -אין לנו ארץ אחרת

חיפוש בתוך קבצים עם הפקודה GREP של לינוקס

מחבר:
בתאריך:

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

חיפוש בתוך קבצים עם GREP

המדריך נכתב במקור באנגלית. לקריאת מדריך GREP באנגלית.

כדי להדגים את הנלמד במדריך הכנתי מראש תיקייה ששמה "quotes" הכוללת שני קבצי טקסט. זה מבנה התיקייה:

quotes
    ├── success.txt
    └── programming.txt

בתוך התיקייה ישנם שני קבצים הכוללים ציטוטים על הצלחה ותכנות:

quotes/success.txt

A pessimist sees the difficulty in every opportunity; an optimist sees the opportunity in every difficulty.
Success doesn’t just find you. You have to go out and get it.
Don't let yesterday take too much of today.
It's not whether you get knocked down, it's whether you get up.
Creativity is intelligence having fun.
80 percent of Success is showing up!
Today's accomplishments were yesterday's impossibilities.
You have a limited number of fucks to give in your life, use them wisely.

 

quotes/programming.txt

Java is to JavaScript what car is to Carpet.
Code is like humor. When you have to explain it, it’s bad.
Simplicity is the soul of efficiency.
Before software can be reusable it first has to be usable.
Software testing is a sport like hunting, it's bughunting.
When Java is the only language you know, its limitations become serious.
Talk is cheap. Show me the code.

 

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

המדריך כולל 6 חלקים:

  1. מה זה GREP?
  2. שילובי דגלים
  3. חיפוש בתיקיות
  4. חיפוש באמצעות ביטויים רגולריים
  5. ביטויים רגולריים מתוחכמים יותר עם grep -E
  6. סיכום

 

1. מה זה GREP?

אנחנו משתמשים ב-GREP כדי לחפש טקסטים.

התחביר הבסיסי:

$ grep <exp> <where>

exp הוא הביטוי ו-where אומר לפקודה היכן לחפש.

לדוגמה, נחפש את הביטוי "success" בתוך הקובץ success.txt:

$ grep "success" quotes/success.txt
  • הפקודה מחזירה תוצאה ריקה מפני שהביטוי לא קיים בקובץ.

אבל אם נחפש את הביטוי "Success" המתחיל באות גדולה:

$ grep "Success" quotes/success.txt

נקבל את התוצאה:

Success doesn’t just find you. You have to go out and get it.
80 percent of Success is showing up!

ומכאן המסקנה ש-GREP מבחין בין אותיות קטנות וגדולות.

תלוי במערכת עליה אתה עובד. יכול להיות שתצטרך להשתמש בדגל --color כדי לצבוע את ההתאמה בצבע:

$ grep -i --color "success" quotes/success.txt

התוצאה:

Success doesn’t just find you. You have to go out and get it.
80 percent of Success is showing up!

נשתמש בדגל -i (case insensitive) כדי ש-GREP לא יתחשב בגודל האותיות:

$ grep -i "success" quotes/success.txt

התוצאה:

Success doesn’t just find you. You have to go out and get it.
80 percent of Success is showing up!

נשתמש בדגל -n כדי להציג את מספרי השורות:

$ grep -n "Success" quotes/success.txt

התוצאה:

2:Success doesn’t just find you. You have to go out and get it.
6:80 percent of Success is showing up!

 

2. שילובי דגלים

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

לדוגמה, נשלב את הדגל -i בשביל לחפש אותיות קטנות/גדולות עם -n בשביל לראות את מספרי השורות:

$ grep -in "success" quotes/success.txt

התוצאה:

2:Success doesn’t just find you. You have to go out and get it.
6:80 percent of Success is showing up!

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

לדוגמה, 2 שורות:

$ grep -in -B 2 "having fun" quotes/success.txt

התוצאה:

3-Don't let yesterday take too much of today.
4-It's not whether you get knocked down, it's whether you get up.
5:Creativity is intelligence having fun.

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

$ grep -in -A 3 "having fun" quotes/success.txt

התוצאה:

5:Creativity is intelligence having fun.
6-80 percent of Success is showing up!
7-Today's accomplishments were yesterday's impossibilities.
8-You have a limited number of fucks to give in your life, use them wisely.

וניתן לשלב את הדגלים -A עם -B כדי להציג מספר שורות לפני ואחרי הביטוי:

$ grep -in -B 2 -A 2 "having fun" quotes/success.txt

התוצאה:

3-Don't let yesterday take too much of today.
4-It's not whether you get knocked down, it's whether you get up.
5:Creativity is intelligence having fun.
6-80 percent of Success is showing up!
7-Today's accomplishments were yesterday's impossibilities.

 

3. חיפוש בתיקיות

אתה לא חייב לחפש בתוך קובץ מסוים אתה יכול לחפש בתיקיה עם הדגל -r (רקורסיבי).

נחפש את המילה Simplicity בתוך התיקייה quotes:

$ grep -r "Simplicity" quotes/

התוצאה:

quotes/programming.txt:Simplicity is the soul of efficiency.
  • הפקודה מחזירה את הנתיב לקובץ (בסגול) עם השורה שבה נמצאה ההתאמה.

כדי לקבל רק את שמות הקבצים נשלב את הדגלים -r עם -l:

$ grep -rl "Simplicity" quotes/

התוצאה:

quotes/programming.txt

כדי להגדיל את הסיכויים למצוא התאמה השתמש בדגל -i כדי שתוכל למצוא דפוסי התאמה ללא התחשבות בגודל האות:

$ grep -ril "simplicity" quotes/

הדגל -w מוצא התאמה למילים שלמות.

נמצא שורות המכילות את המילה "up":

It's not whether you get knocked down, it's whether you get up.
80 percent of Success is showing up!

כדי להגביל את מספר התוצאות, השתמש בדגל -m תוך ציון המספר המרבי של תוצאות להם אתה מצפה.

לדוגמה, לכל היותר 2 התאמות למונח "humor":

$ grep -m 2 'humor' quotes/programming.txt

מה לגבי מציאת מחרוזות בקבצים השייכים לסוג מסויים בלבד? לדוגמה, קבצים שיש להם סיומת py, sh או txt. לצורך חיפוש מסוג זה אנחנו יכולים להעזר בדגל --include. לדוגמה:

$ grep -ri --include='*.txt' 'campaign' .
  • במטרה לחפש את הביטוי campaign רק בקבצים מסוג txt הנמצאים בתיקייה הנוכחית.

 

4. חיפוש באמצעות ביטויים רגולריים

כדי למצוא ביטויים חלופיים (א' או ב') נשתמש בתו המיוחד צינור | בין החלופות.

לדוגמה, ננסה למצוא התאמות בתנאי שהם מכילות את אחת ההתאמות "humor" או "wise":

$ grep -r 'humor\|wise' quotes/

התוצאה:

quotes/success.txt:You have a limited number of fucks to give in your life, use them wisely.
quotes/programming.txt:Code is like humor. When you have to explain it, it’s bad.

חשוב לא לשכוח להשתמש בתו escape לפני הצינור \| אחרת זה לא יעבוד.

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

נשתמש בתו המיוחד גג ^ (shift + 6) כדי לחפש בתחילת השורות.

לדוגמה, נחפש את הביטוי "talk" בתחילת השורה עם אותיות קטנות/גדולות:

$ grep -ir "^talk" quotes/

התוצאה:

quotes/programming.txt:Talk is cheap. Show me the code.

נשתמש בתו המיוחד דולר $ כדי לחפש בסוף השורות.

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

$ grep -inr "up\.$" quotes/

התוצאה:

quotes/success.txt:4:It's not whether you get knocked down, it's whether you get up.
  • בביטוי החיפוש "up\.$" השתמשתי בקו נטוי לפני הנקודה כדי ש-GREP יחפש נקודה. מכיוון שנקודה בביטוי רגולרי היא תו מיוחד שמשמעותו כל תו.

נשתמש בתו המיוחד נקודה (.) כדי לחפש שורות המסתיימות בביטוי up ואחריו כל תו בסוף השורה:

$ grep -inr "up.$" quotes/

התוצאה:

quotes/success.txt:4:It's not whether you get knocked down, it's whether you get up.
quotes/success.txt:6:80 percent of Success is showing up!

 

5. ביטויים רגולריים מתוחכמים יותר עם grep -E

הדגל -E מאפשר חיפוש באמצעות ביטויים רגולריים יותר מתוחכמים.

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

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

לדוגמא, נחפש ביטוי שבו מופיעה האות "p" פעמיים ברצף:

$ grep -E p{2} quotes/success.txt

התוצאה:

A pessimist sees the difficulty in every opportunity; an optimist sees the opportunity in every difficulty.

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

בנוסף:

  • {x,}- מציין מינימום של x חזרות
  • {,y} - מציין לכל היותר y חזרות

נציין טווחים של תווים בתוך סוגריים מרובעים. לדוגמה:

  • [a-z] - מציין את כל האותיות הקטנות באנגלית
  • [A-Z] - מציין את כל האותיות הגדולות
  • [0-9] - מציין את כל הספרות מ-0 ועד 9
  • [א-ת] - כל האותיות בעברית מאל"ף ועד ת"ו.

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

$ grep -E '[0-9]{1,}' quotes/success.txt

התוצאה:

80 percent of Success is showing up!

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

לדוגמה, המילה humor (הומור) ניכתבת בתעתיק בריטי עם u אחרי ה-o. הביטוי הרגולרי humou?r מאתר את המילה ללא תלות בתעתיק:

$ grep -E humou?r quotes/programming.txt

התוצאה:

Code is like humor. When you have to explain it, it’s bad.

 

הפקודה הבאה אף היא משתמש ב-GREP בצורה מתוחכמת ומאפשרת למצוא את כל כתובות המייל בתיקייה:

$ grep -rnoE "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" /path/to/dir/

הביטוי הרגולרי מיועד לאתר כתובות אימייל.

הדגלים שמקבלת הפקודה grep מורים לה:

  • r - לחפש רקורסיבית בתיקיות
  • n - להדפיס את מספרי השורות בהם נמצאת התאמה
  • o - להדפיס את חלק המחרוזת המתאים למונח החיפוש
  • E - לאפשר חיפוש באמצעות ביטויים רגולריים מורכבים

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

$ grep -rnoE "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" /path/to/dir/ >  emails.txt
  • אחרי החץ ימינה מופיע שם הקובץ אליו יש להפנות את תוצאת הפעולה של הפקודה. אם תרצה ללמוד יותר על הפניות בלינוקס כדאי לך לקרוא את המדריך לינוקס - צינורות והפניות.

 

6. סיכום

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

$ man grep

 

אולי גם זה יעניין אותך:

עריכת קבצים על Linux באמצעות vim

מערכת הקבצים של Linux - מה שרצית לדעת ולא העזת לשאול

לינוקס - צינורות והפניות

 

לכל המדריכים בסדרת הלינוקס

 

אהבתם? לא אהבתם? דרגו!

0 הצבעות, ממוצע 0 מתוך 5 כוכבים

 

 

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

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

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

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

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

הוסף תגובה חדשה

 

 

ענה על השאלה הפשוטה הבאה כתנאי להוספת תגובה:

מהם שלוש רשויות השלטון בישראל?

 

תמונת המגיב

מאיר בתאריך: 23.11.2020

אחלה מדריך, הנה משהו שיכול להוסיף לפוסט
grep -C5 שווה ערך ל
grep -A5 -B5