כיצד להשתמש בפקודה grep בלינוקס

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

הסיפור שמאחורי grep

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

קן תומפסון חילץ את יכולות חיפוש הביטוי הרגיל edמהעורך (מבוטא ee-dee) ויצר תוכנית קטנה - לשימושו עצמו - לחיפוש בקבצי טקסט. ראש המחלקה שלו במעבדות בל, דאג מקילרוי, ניגש לתומפסון ותיאר את הבעיה שעמו עמד עמיתיו, לי מקמהון.

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

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

חיפושים פשוטים עם grep

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

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

כינוי grep = "grep - צבע = אוטומטי"

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

grep -i ממוצע geek-1.log

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

אנו יכולים להציג את השורות שאינן תואמות באמצעות האפשרות -v (התאמה הפוכה).

grep -v Mem geek-1.log

אין הדגשה מכיוון שאלו השורות שאינן תואמות.

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

grep -q ממוצע חנון -1
הד $?
grep -q howtogeek geek-1.log
הד $?

חיפושים רקורסיביים בעזרת grep

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

grep -r -i memfree.

הפלט כולל את הספריה ושם הקובץ של כל שורה תואמת.

אנו יכולים ליצור  grep  קישורים סמליים הבאים באמצעות האפשרות -R(dereference recursive). יש לנו קישור סמלי בספריה זו, שנקרא logs-folder. זה מצביע על /home/dave/logs.

ls -l יומני-תיקיה

בואו נחזור על החיפוש האחרון שלנו עם האפשרות  -R(הישנות רקורסיבית):

grep -R -i memfree.

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

מחפש מילים שלמות

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

grep -i חנון חינם 1.log

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

כדי לאלץ grep להתאים "מילים" נפרדות בלבד, השתמש באפשרות -w(word regexp).

grep -w -i geek חינם 1.log
הד $?

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

שימוש במונחי חיפוש מרובים

האפשרות -E(מורחבת regexp) מאפשרת לך לחפש מספר מילים. ( -Eהאפשרות מחליפה את egrepהגרסה שהוצא משימוש grep.)

פקודה זו מחפשת שני מונחי חיפוש, "ממוצע" ו- "memfree".

grep -E -w -i "ממוצע | memfree" geek-1.log

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

אתה יכול גם לחפש מונחים מרובים שאינם בהכרח מילים שלמות, אך הם יכולים להיות גם מילים שלמות.

האפשרות -e(תבניות) מאפשרת לך להשתמש במונחי חיפוש מרובים בשורת הפקודה. אנו משתמשים בתכונה של סוגר הביטוי הרגיל ליצירת דפוס חיפוש. זה אומר grepלהתאים לכל אחת מהדמויות הכלולות בסוגריים "[]". פירוש הדבר grepיתאים ל- "kB" או ל- "KB" בזמן שהוא מחפש.

שני המיתרים מותאמים, ולמעשה, כמה שורות מכילות את שני המיתרים.

התאמת קווים בדיוק

-x(הקו ביטויסדיר) יתאים רק שורות שבן הקו כולו תואם את מונח החיפוש. בואו נחפש חותמת תאריך ושעה שאנחנו יודעים שמופיעה רק פעם אחת בקובץ היומן:

grep -x "20-Jan - 06 15:24:35" geek-1.log

השורה היחידה שמתאימה נמצאת ומוצגת.

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

אנו יכולים לסנן ביעילות את שורות ההערות כך:

sudo grep -v "#" / etc / sudoers

זה הרבה יותר קל לנתח.

מציג רק טקסט תואם

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

grep -o MemFree geek-1.log

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

סופרים עם גרפ

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

grep -c ממוצע חנון -1

grep מדווח כי מונח החיפוש מופיע 240 פעמים בקובץ זה.

ניתן grepלהציג את מספר השורה עבור כל שורה תואמת באמצעות האפשרות -n(מספר שורה).

grep -n Jan geek-1.log

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

כדי להפחית את מספר התוצאות המוצגות, השתמש באפשרות -m(ספירה מקסימלית). אנו נגביל את התפוקה לחמש שורות תואמות:

grep -m5 -n Jan geek-1.log

הוספת הקשר

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

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

grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log

כדי לראות כמה שורות לפני השורה התואמת, השתמש באפשרות -B(הקשר לפני).

grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log

וכדי לכלול שורות מלפני ואחרי השורה התואמת השתמש באפשרות -C(הקשר).

grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log

מציג קבצים תואמים

כדי לראות את שמות הקבצים המכילים את מונח החיפוש, השתמש באפשרות -l (קבצים עם התאמה). כדי לגלות אילו קבצי קוד מקור C מכילים הפניות sl.hלקובץ הכותרת, השתמש בפקודה זו:

grep -l "sl.h" *. ג

שמות הקבצים מפורטים, ולא השורות התואמות.

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

grep -L "sl.h" *. ג

התחלה וסוף קווים

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

grep "^" geek-1.log

השורות שיש להן רווח כתו הראשון - בתחילת השורה - מוצגות.

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

grep "00 $" geek-1.log

התצוגה מציגה את השורות עם התווים הסופיים "00".

שימוש בצינורות עם grep

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

נניח שאנחנו רוצים לראות את כל המופעים של המחרוזת "ExtractParameters" בקובצי קוד המקור שלנו. אנו יודעים שיהיו לא מעט, אז אנו מקטרים ​​את התפוקה ל less:

grep "ExtractParameters" * .c | פָּחוּת

התפוקה מוצגת ב less.

זה מאפשר לך לדפדף ברישום הקבצים ולהשתמש less'sבמתקן החיפוש.

אם אנו מצנפים את הפלט grepאל תוך wcומשתמשים באפשרות -l(שורות), אנו יכולים לספור את מספר השורות בקבצי קוד המקור המכילים "ExtractParameters". (נוכל להשיג זאת באמצעות האפשרות grep-c(ספירה), אך זוהי דרך מסודרת להפגין צנרת grep.)

grep "ExtractParameters" * .c | wc -l

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

ls -l | grep "אוגוסט" | מיין + 4n

בואו נשבור את זה:

  • ls -l : בצע רישום בפורמט ארוך של הקבצים באמצעות ls.
  • grep "Aug" : בחר את השורות מתוך lsהרישום ובהן "Aug". שים לב שהדבר ימצא גם קבצים ששמם "אוג".
  • מיין + 4n : מיין את הפלט מ- grep בעמודה הרביעית (גודל הקובץ).

אנו מקבלים רשימה ממוינת של כל הקבצים ששונו באוגוסט (ללא קשר לשנה), בסדר עולה של גודל הקובץ.

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

grep: פחות פיקוד, יותר בעל ברית

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

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

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