שימוש ב- grep (ו- egrep) עם ביטויים רגולריים

Using Grep With Regular Expressions



הדרכה זו מתארת ​​כיצד להשתמש בשניהם אחיזה (וגם egrep) t o למצוא טקסט בקבצים, בצורתם הפשוטה ומשולב עם ביטויים רגילים. הוא מכיל מספר דוגמאות ו תרגילים , יותר פתרונות , להשלמת הצופה.

השם אחיזה מגיע מהפקודה ed (ו- vim) g/re/p, שפירושו חיפוש גלובלי אחר ביטוי רגיל נתון והדפסה (הצגה) של הפלט.







רגיל ביטויים

כלי השירות מאפשרים למשתמש לחפש בקבצי טקסט שורות התואמות ביטוי רגיל ( regexp ). ביטוי רגיל הוא מחרוזת חיפוש המורכבת מטקסט ואחד או יותר מ -11 תווים מיוחדים. דוגמה פשוטה היא התאמת התחלה של שורה.



קובץ לדוגמא

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



השתמש בעורך כגון nano או vim כדי להעתיק את הטקסט שלהלן לקובץ בשם המסמך שלי .





xyz
xyzde
exyzd
dexyz
d? gxyz
xxz
xzz
x z
x*z
xz
x z
XYZ
XYYZ
xYz
xyyz
xyyyz
xyyyyz

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

לפני שתנסה את הדוגמאות, צפה בקובץ לדוגמא:



$חתולהמסמך שלי

חיפוש פשוט

כדי למצוא את הטקסט 'xyz' בתוך הקובץ הפעל את הפעולות הבאות:

$אחיזהxyz myfile

שימוש בצבעים

כדי להציג צבעים, השתמש –צבע (מקף כפול) או פשוט צור כינוי. לדוגמה:

$אחיזה --צֶבַעxyz myfile

אוֹ

$כינוי אחיזה= 'אחיזה--צֶבַע'
$אחיזהxyz myfile

אפשרויות

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

  • -אני מוצא את כל השורות בלי קשר של מקרה
  • לספור כמה שורות מכילות את הטקסט
  • -קו תצוגה מספרים של קווים תואמים
  • -תצוגה l בלבד קוֹבֶץ שמות ההתאמה ההיא
  • -r רקורסיבי חיפוש בספריות משנה
  • -v למצוא את כל השורות לֹא המכיל את הטקסט

לדוגמה:

$אחיזה -אניxyz myfile# מצא טקסט ללא קשר למקרה

$אחיזה -icxyz myfile# מספר שורות עם טקסט

$אחיזה xyz myfile# הצג מספרי קו

צור קבצים מרובים

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

$זרקxyz>myfile1
$זרק xyz nxzz nXYZ>myfile2
$זרק xxx nyyy>myfile3
$חתולmyfile1
$חתולmyfile2
$חתולmyfile3

חפש מספר קבצים

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

$אחיזה -icxyz myfile myfile1 myfile2 myfile3
$אחיזה xyz שלי*
# התאמת שמות קבצים המתחילים ב- 'שלי'

תרגיל I

  1. ספר קודם כל כמה שורות יש בקובץ /etc /passwd.
רמז: שימוששירותים /וכו/passwd
  1. כעת מצא את כל מופעי הטקסט איפה בקובץ /etc /passwd .
  2. מצא כמה שורות בקובץ מכילות את הטקסט
  3. מצא כמה שורות אינן מכילות את הטקסט איפה .
  4. מצא את הערך לכניסה שלך ב- /etc/passwd

ניתן למצוא פתרונות תרגיל בסוף מאמר זה.

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

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

התווים המיוחדים הזמינים כוללים:

^ התחלה של שורה
$ סוף שורה
. כל תו (למעט n קו חדש)
* 0 או יותר מהביטוי הקודם
הקמת סמל הופכת אותו לדמות מילולית

שים לב שה- *, שניתן להשתמש בו בשורת הפקודה כדי להתאים לכל מספר תווים כולל אף אחד, הוא לֹא משמש באותו אופן כאן.

שימו לב גם לשימוש במרכאות בדוגמאות הבאות.

דוגמאות

כדי למצוא את כל השורות המתחילות בטקסט באמצעות התו ^:

$אחיזהקובץ my^'xyz'

כדי למצוא את כל השורות שמסתיימות בטקסט באמצעות התו $:

$אחיזה'Xyz $' myfile

כדי למצוא שורות המכילות מחרוזת באמצעות ^ וגם $ תווים:

$אחיזה'^Xyz $' myfile

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

$אחיזהקובץ '^x.z' שלי

כדי למצוא שורות באמצעות * להתאמת 0 או יותר מהביטוי הקודם:

$אחיזה'^Xy*z 'myfile

כדי למצוא שורות באמצעות.* כדי להתאים 0 או יותר של כל תו:

$אחיזה'^ X.*z 'myfile

כדי למצוא שורות באמצעות להימלט מהדמות *:

$אחיזה'^ X *z 'myfile

כדי למצוא את תו השתמש:

$אחיזה'\' המסמך שלי

ביטוי grep - egrep

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

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

שים לב שהביטויים חייבים להיות כלולים בתוך זוג ציטוטים.

כדי להשתמש בצבעים, השתמש –צבע או צור שוב כינוי:

$כינוי egrep='egrep -צבע'

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

| חילוף, זה או אחר
(…) קיבוץ לוגי של חלק מביטוי
$egrep '(^root |^uucp |^מייל)' /וכו/passwd

זה מחלץ את השורות המתחילות עם root, uucp או דואר מהקובץ, ה-. סמל שמשמעותו אחת מהאפשרויות.

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

$אחיזה '(^root |^uucp |^מייל)' /וכו/passwd

עם זאת, ברוב מערכות לינוקס הפקודה grep -E זהה לשימוש egrep :

$אחיזה '(^root |^uucp |^מייל)' /וכו/passwd

שימוש במסננים

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

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

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

פעולה זו תציג רק ספריות ב /וכו :

$ls /וכו|אחיזה'^ד'|יותר

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

$נ.ב -ef|אחיזהcron

$מי|אחיזהkdm

קובץ לדוגמא

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

השתמש בעורך כגון nano או vim כדי להעתיק את הטקסט שלהלן לקובץ בשם אֲנָשִׁים:

J.Smith אישי 25000
אישי E.Smith 25400
אימון א 'שחום 27500
הדרכה ג '. 23400
(מנהל) R.Bron 30500
Goodsout T.Smyth 30000
אישי F.Jones 25000
הדרכה* C. Evans 25500
Goodsout W.Pope 30400
קומת קרקע T.Smythe 30500
ג'יי מאלר אישי 33000

תרגיל ב '

  1. הצג את הקובץ אֲנָשִׁים ולבחון את תוכנו.
  2. מצא את כל השורות המכילות את המחרוזת נַפָּח בקובץ אנשים. רמז: השתמש בפקודה grep אך זכור כי כברירת מחדל, הוא תלוי רישיות.
  3. צור קובץ חדש, npeople, המכיל את כל השורות המתחילות במחרוזת אישי בקובץ האנשים. רמז: השתמש בפקודה grep עם>.
  4. אשר את תוכן הקובץ npeople על ידי רישום הקובץ.
  5. כעת צרף את כל השורות שבהן הטקסט מסתיים במחרוזת 500 בקובץ אנשים לקובץ npeople.Tip: השתמש בפקודה grep עם >>.
  6. שוב, אשר את תוכן אנשי הקובץ על ידי רישום הקובץ.
  7. מצא את כתובת ה- IP של השרת המאוחסן בקובץ /etc/hosts רמז: השתמש בפקודה grep עם $ (שם מארח)
  8. להשתמש egrep לחלץ מה /etc/passwd שורות חשבון קבצים המכילים lp או שלך תעודת זהות של משתמש .

ניתן למצוא פתרונות תרגיל בסוף מאמר זה.

עוד ביטויים רגילים

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

יש אחת עשרה תווים בעלי משמעויות מיוחדות: סוגריים מרובעים פתיחה וסגירה [], קו נטוי , הסימן ^, סימן הדולר $, הנקודה או הנקודה., הסרגל האנכי או סמל הצינור |, סימן השאלה?, כוכבית או כוכב *, סימן החיבור + וסוגר הסיבוב הפותח והסוגר {}. תווים מיוחדים אלה נקראים לעתים קרובות גם מטא -תווים.

להלן הסט המלא של הדמויות המיוחדות:

^ התחלה של שורה
$ סוף שורה
. כל תו (למעט n קו חדש)
* 0 או יותר מהביטוי הקודם
| חילוף, זה או אחר
[…] קבוצת תווים מפורשת להתאמה
+ 1 או יותר מהביטוי הקודם
? 0 או 1 של הביטוי הקודם
הקמת סמל הופכת אותו לדמות מילולית
{…} ציון כימות מפורש
(…) קיבוץ לוגי של חלק מביטוי

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

כדי למצוא שורות באמצעות | כדי להתאים את אחד מהביטויים:

$egrep'Xxz|xzz 'myfile

כדי למצוא שורות באמצעות | כדי להתאים אחד מהביטויים בתוך מחרוזת השתמש גם ב- ():

$egrep'^ X(Yz|yz)' המסמך שלי

כדי למצוא שורות באמצעות [] להתאמת כל תו:

$egrep'^ X[כן]z 'myfile

כדי למצוא שורות באמצעות [] כדי לא להתאים לאף תו:

$egrep'^ X[^ יא]z 'myfile

כדי למצוא שורות באמצעות * להתאמת 0 או יותר מהביטוי הקודם:

$egrep'^Xy*z 'myfile

כדי למצוא שורות באמצעות ה + כדי להתאים 1 או יותר מהביטוי הקודם:

$egrep'^Xy+z' myfile

כדי למצוא קווים באמצעות? כדי להתאים 0 או 1 של הביטוי הקודם:

$egrep'^Xy? Z' myfile

תרגיל III

  1. מצא את כל השורות המכילות את השמות אוונס אוֹ צייר באנשי הקובץ.
  2. מצא את כל השורות המכילות את השמות סמית ', סמית' אוֹ Smythe באנשי הקובץ.
  3. מצא את כל השורות המכילות את השמות בראון, בראון אוֹ מָקוֹר בקובץ אנשים. אם יש לך זמן:
  4. מצא את השורה המכילה את המחרוזת (מנהל), כולל הסוגריים, באנשי הקובץ.
  5. מצא את השורה המכילה את התו * באנשי הקובץ.
  6. שלב 5 ו- 6 לעיל כדי למצוא את שני הביטויים.

דוגמאות נוספות

כדי למצוא שורות באמצעות . ו * להתאמה לכל קבוצת הדמויות:

$egrep'^Xy.*z 'myfile

כדי למצוא שורות באמצעות {} להתאמת N מספר תווים:

$egrep'^Xy{3}z 'myfile
$egrep'^Xy{4}z 'myfile

כדי למצוא שורות באמצעות {} כדי להתאים N או יותר פעמים:

$egrep'^Xy{3,}z 'myfile

כדי למצוא שורות באמצעות {} להתאמת N פעמים אך לא יותר מ- M:

$egrep'^Xy{2,3}z 'myfile

סיכום

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

הצעדים הבאים

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

פתרונות התעמלות

תרגיל I

ספר קודם כל כמה שורות יש בקובץ /etc/passwd .
$ wc -l /etc/passwd
כעת מצא את כל מופעי הטקסט איפה בקובץ /etc /passwd.
$ grep var /etc/passwd
מצא כמה שורות בקובץ מכילות את הטקסט איפה

אחיזה איפה/וכו/passwd

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

אחיזה -קו'חאיפה/וכו/passwd

מצא את הערך לכניסה שלך ב- /etc/passwd קוֹבֶץ
grep kdm /etc/passwd

תרגיל ב '

הצג את הקובץ אֲנָשִׁים ולבחון את תוכנו.
$ cat people
מצא את כל השורות המכילות את המחרוזת נַפָּח בקובץ אֲנָשִׁים .
$ grep 'Smith' people
צור קובץ חדש, אנשים , המכיל את כל השורות המתחילות במחרוזת אישי בתוך ה אֲנָשִׁים קוֹבֶץ
$ grep '^Personal' people> npeople
אשר את תוכן הקובץ אנשים על ידי רישום הקובץ.
$ cat npeople
כעת צרף את כל השורות שבהן הטקסט מסתיים במחרוזת 500 בקובץ אֲנָשִׁים לקובץ אנשים .
$ grep '500$' people>>npeople
שוב, אשר את תוכן הקובץ אנשים על ידי רישום הקובץ.
$ cat npeople
מצא את כתובת ה- IP של השרת המאוחסן בקובץ /etc/hosts .
$ grep $(hostname) /etc/hosts
להשתמש egrep לחלץ מה /etc/passwd שורות חשבון קבצים המכילים lp או מזהה משתמש משלך.
$ egrep '(lp|kdm:)' /etc/passwd

תרגיל III

מצא את כל השורות המכילות את השמות אוונס אוֹ צייר בקובץ אֲנָשִׁים .
$ egrep 'Evans|Maler' people
מצא את כל השורות המכילות את השמות נַפָּח , סמית ' אוֹ Smythe בקובץ אֲנָשִׁים .
$ egrep 'Sm(i|y)the?' people
מצא את כל השורות המכילות את השמות חום , בראון אוֹ מָקוֹר באנשי הקובץ.
$ egrep 'Brow?e?n' people
מצא את השורה המכילה את המחרוזת (מנהל), כולל הסוגריים, בקובץ אֲנָשִׁים .

$egrep ' (מנהל )'אֲנָשִׁים

מצא את השורה המכילה את הדמות * באנשי הקובץ.
$ egrep '*' people
שלב 5 ו- 6 לעיל כדי למצוא את שני הביטויים.

$egrep ' (מנהל ) | *'אֲנָשִׁים