אנדרואיד

פקודת גריפ בלינוקס (מצא טקסט בקבצים)

Терминал Linux #3 - Команда Grep: поиск по файлам и папкам

Терминал Linux #3 - Команда Grep: поиск по файлам и папкам

תוכן עניינים:

Anonim

הפקודה grep "הדפס ביטוי רגיל גלובלי" היא אחת מהפקודות החזקות והנפוצות ביותר בלינוקס.

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

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

תחביר פיקוד Grep

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

ביטויי השירות של grep לובשים את הצורה הבאה:

grep PATTERN

הפריטים בסוגריים מרובעים הם לא חובה.

  • OPTIONS - אפס או יותר אפשרויות. גרפ מספקת מספר אפשרויות השולטות בהתנהגותה. PATTERN - דפוס חיפוש. FILE - שמות קבצי קלט אפסיים או יותר.

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

כיצד להשתמש ב- grep כדי לחפש מחרוזת בקבצים

השימוש הבסיסי ביותר בפקודת grep הוא חיפוש מחרוזת (טקסט) בקובץ.

לדוגמה, כדי להציג את השורות מקובץ /etc/passwd המכיל את המחרוזת, אתה יכול להשתמש בפקודה הבאה:

grep bash /etc/passwd

הפלט צריך להיראות כך:

root:x:0:0:root:/root:/bin/bash linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

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

grep "Gnome Display Manager" /etc/passwd

הפוך התאמה (אל תכלול)

להצגת השורות שאינן תואמות תבנית, השתמש באפשרות -v (או --invert-match ).

לדוגמה כדי להציג את השורות מקובץ /etc/passwd שאינם מכילים את nologin אתה יכול להשתמש בפקודה הבאה:

grep -v nologin /etc/passwd

root:x:0:0:root:/root:/bin/bash colord:x:124:124::/var/lib/colord:/bin/false git:x:994:994:git daemon user:/:/usr/bin/git-shell linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

כיצד להשתמש ב- Grep כדי לחפש מחרוזת בפלט הפקודה

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

לדוגמה, כדי לגלות אילו תהליכים פועלים במערכת שלך כ- www-data למשתמש www-data תוכל להשתמש בפקודת ה- ps הבאה:

ps -ef | grep www-data

www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process

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

ps -ef | grep www-data | grep -v grep

www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process

חיפוש רקורסיבי

לחיפוש רקורסיבי אחר תבנית השתמש באפשרות, השתמש באפשרות -r (או - --recursive ). פעולה זו תחפש בכל הקבצים בספרייה שצוינה, ותדלג על קישורי הסימן שנמצאים רקורסיבית. כדי לעקוב אחר כל הקישורים הסמליים, השתמש באפשרות -R (או - --dereference-recursive ).

בדוגמה הבאה אנו מחפשים את המחרוזת linuxize.com בכל הקבצים בספריית /etc :

grep -r linuxize.com /etc

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

/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com;

אם במקום זאת, אם אתה משתמש באפשרות -R grep יעקוב אחר כל הקישורים הסמליים:

grep -R linuxize.com /etc

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

/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com; /etc/nginx/sites-enabled/linuxize.com: server_name linuxize.com www.linuxize.com;

הצג רק את שם הקובץ

כדי לדכא את תפוקת ה- grep המוגדרת כברירת מחדל ולהדפיס רק את שמות הקבצים המכילים את התבנית המותאמת, באפשרותך להשתמש באפשרות -l (או - --files-with-matches ).

לדוגמה לחיפוש בכל הקבצים המסתיימים ב- .conf בספריית העבודה הנוכחית ולהדפיס רק את שמות הקבצים המכילים את המחרוזת linuxize.com :

grep -l linuxize.com *.conf

הפלט ייראה כך:

tmux.conf haproxy.conf

בדרך כלל משתמשים באפשרות -l בשילוב עם האפשרות רקורסיבית -R :

grep -Rl linuxize.com /tmp

חיפוש לא רגיש

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

כדי להתעלם ממקרה בעת חיפוש, השתמשו באפשרות -i (או --ignore-case ).

לדוגמה, בעת חיפוש אחר Zebra ללא אפשרות, הפקודה הבאה לא תציג פלט כלשהו, ​​כלומר יש שורות תואמות:

grep Zebra /usr/share/words

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

grep -i Zebra /usr/share/words

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

zebra zebra's zebras

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

בעת חיפוש אחר "gnu", grep ידפיס גם את השורות בהן "gnu" משובץ במילים גדולות יותר, כמו "cygnus" או "magnum".

grep gnu /usr/share/words

cygnus gnu interregnum lgnu9d lignum magnum magnuson sphagnum wingnut

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

תווי מילים כוללים תווים אלפאנומריים ( az , AZ ו- 0-9 ) 0-9 תחתונים ( _ ). כל שאר התווים נחשבים כתווים שאינם מילים.

grep -w gnu /usr/share/words

gnu

הצג מספרי שורה

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

לדוגמה כדי להציג את השורות מקובץ /etc/services המכיל את המחרוזת bash עם מספר השורה התואם, תוכלו להשתמש בפקודה הבאה:

grep -n 10000 /etc/services

הפלט שלהלן מראה לנו שהגפרורים נמצאים בקווים 10423 ו- 10424.

10423:ndmp 10000/tcp 10424:ndmp 10000/udp

ספירת גפרורים

כדי להדפיס ספירת שורות תואמות לפלט רגיל, השתמש באפשרות -c (או -).

בדוגמה למטה אנו סופרים את מספר החשבונות שיש להם /usr/bin/zsh כקליפה.

grep -c '/usr/bin/zsh' /etc/passwd

4

חפש מחרוזות מרובות (דפוסים)

ניתן לחבר לשני דפוסי חיפוש או יותר באמצעות מפעיל OR | .

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

בדוגמה למטה אנו מחפשים את כל המופעים של המילים fatal , error וחיוניות בקובץ השגיאה של יומן Nginx:

grep 'fatal\|error\|critical' /var/log/nginx/error.log

grep -E 'fatal|error|critical' /var/log/nginx/error.log

מצב שקט

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

להלן דוגמה לשימוש ב- grep במצב שקט כפקודת מבחן בהצהרת if :

if grep -q PATTERN filename then echo pattern found else echo pattern not found fi

ביטוי רגיל בסיסי

ל- GNU Grep שתי קבוצות תכונות ביטוי רגילות, בסיסיות ומורחבות. כברירת מחדל, grep מפרש את התבנית כביטוי רגיל בסיסי.

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

  • השתמש בסמל ^ (caret) כדי להתאים ביטוי בתחילת קו. בדוגמה הבאה, המחרוזת ^kangaroo תתאים רק אם היא מתרחשת ממש בתחילת שורה.

    grep "^kangaroo" file.txt

    השתמש בסמל $ (דולר) כדי להתאים לביטוי בסוף שורה. בדוגמה הבאה, מחרוזת kangaroo$ תתאים רק אם היא מתרחשת בסוף קו.

    grep "kangaroo$" file.txt

    השתמש ב- . (נקודה) סמל כדי להתאים לכל דמות יחידה. לדוגמה, כדי להתאים לכל דבר שמתחיל עם kan יש שתי תווים ומסתיים במחרוזת roo , אתה יכול להשתמש בתבנית הבאה:

    grep "kan..roo" file.txt

    להשתמש (סוגריים) כדי להתאים לכל תו בודד הסגור בסוגריים. לדוגמה, מצא את השורות הכוללות accept או " accent , אתה יכול להשתמש בתבנית הבאה:

    grep "accet" file.txt

    להשתמש (סוגריים) כדי להתאים לכל תו בודד הסגור בסוגריים. התבנית הבאה תתאים לכל שילוב של מיתרים המכילים co(any_letter_except_l)a , כגון coca , cobalt וכן הלאה, אך לא יתאימו לקווים המכילים cola , grep "coa" file.txt

כדי לברוח מהמשמעות המיוחדת של הדמות הבאה, השתמש בסמל \ (קו אחורי).

ביטויים רגילים מורחבים

כדי לפרש את התבנית כביטוי רגיל מורחב, השתמש באפשרות -E (או --extended-regexp ). ביטויים רגילים מורחבים כוללים את כל הדמויות המטא-בסיסיות, יחד עם מטא-תווים נוספים ליצירת דפוסי חיפוש מורכבים וחזקים יותר. להלן כמה דוגמאות:

  • התאם ולחלץ את כל כתובות הדוא"ל מקובץ נתון:

    grep -E -o "\b+@+\.{2, 6}\b" file.txt

    התאם ולחלץ את כל כתובות ה- IP התקפות מקובץ נתון:

    grep -E -o '(25|2|??)\.(25|2|??)\.(25|2|??)\.(25|2|??)' file.txt

האפשרות -o משמשת להדפסת מחרוזת התאמה בלבד.

הדפס קווים לפני משחק

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

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

grep -B 5 root /etc/passwd

הדפס קווים לאחר משחק

כדי להדפיס מספר ספציפי של שורות לאחר שורות התאמה, השתמש באפשרות -A (או --after-context ).

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

grep -A 5 root /etc/passwd

סיכום

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

יש עוד הרבה דברים ללמוד על Grep בדף מדריך למשתמש של Grep.

מסוף grep