איך לסנן טקסט או מחרוזת באמצעות Awk וביטויים רגולריים – חלק 1

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

מהם ביטויי הרגילים?

A regular expression can be defined as strings that represent several sequences of characters. One of the most important things about regular expressions is that they allow you to filter the output of a command or file, edit a section of a text or configuration file, and so on.

מאפיינים של ביטויים רגילים

ביטויים רגילים מורכבים מ־:

  • תווים רגילים כמו רווח, קו תחתון (_), A-Z, a-z, 0-9.
  • תווי מטא שמתרחבים לתווים רגילים, כוללים:
    • (.) הוא מתאים לכל תו יחיד מלבד שורת חדש.
    • (*) הוא מתאים לאפס או יותר מופעים של התו הישיר שלפניו.
    • [תו או תווים] מתאים לאחד מהתווים המצויינים בתוו או בתווים, אפשר גם להשתמש במקף (-) כדי לציין טווח של תווים כמו [a-f], [1-5], וכו'.
    • ^ הוא מתאים להתחלת שורה בקובץ.
    • $ מתאים לסוף השורה בקובץ.
    • \ זהו תו ירידה.

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

תחביר הכללי של awk הוא:

awk 'script' filename

שבו 'script' הוא סט של פקודות שניתן להבין על ידי awk והן מבוצעות על הקובץ, שם_קובץ.

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

ה־'script' כתוב בצורת '/pattern/ פעולה' כאשר התבנית היא ביטוי רגולרי ו־הפעולה היא מה ש־awk תעשה כאשר היא מוצאת את התבנית הנתונה בשורה.

איך להשתמש בכלי סינון Awk ב־Linux

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

הדפסת כל השורות מהקובץ באמצעות Awk

הדוגמה למטה מדפיסה את כל השורות בקובץ /etc/hosts מאחר ולא ניתן תבנית.

awk '//{print}'/etc/hosts
Awk Prints All Lines in a File

שימוש בתבניות Awk: התאמת שורות עם 'localhost' בקובץ

localhost תופס את השורה שיש בה localhost בקובץ /etc/hosts.

awk '/localhost/{print}' /etc/hosts 
Awk Print Given Matching Line in a File

שימוש ב-Awk עם תבנית Wildcard (.)

(.) יתאים למחרוזות המכילות loc, localhost, localnet בדוגמה למטה.

כלומר * l some_single_character c *.

awk '/l.c/{print}' /etc/hosts
Use Awk to Print Matching Strings in a File

שימוש ב-Awk עם (*) תו בתבנית

זה יתאים למחרוזות המכילות localhost, localnet, lines, capable, כמו בדוגמה למטה:

awk '/l*c/{print}' /etc/localhost
Use Awk to Match Strings in File

תבחינו גם ש-(*) מנסה להביא לכם את ההתאמה הארוכה ביותר שניתן לזהות.

נסקור מקרה שמדגים זאת, נקח את הביטוי הרגיל t*t שמשמעו התאמת מחרוזות שמתחילות באות t ומסתיימות ב־t בשורה שמתחת:

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint. 

תקבלו אפשרויות הבאות כאשר אתם משתמשים בתבנית /t*t/:

this is t
this is tecmint
this is tecmint, where you get t
this is tecmint, where you get the best good t
this is tecmint, where you get the best good tutorials, how t
this is tecmint, where you get the best good tutorials, how tos, guides, t
this is tecmint, where you get the best good tutorials, how tos, guides, tecmint

וה-* בתבנית /t*t/ מאפשר ל-Awk לבחור באפשרות האחרונה:

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint

שימוש ב-Awk עם קבוצת [תווים](עקביים)

לדוגמה, קבוצת [al1], כאן Awk יתאים לכל המחרוזות המכילות את התו a או l או 1 בשורה בקובץ /etc/hosts.

awk '/[al1]/{print}' /etc/hosts
Use-Awk to Print Matching Character in File

הדוגמה הבאה מתאימה למחרוזות שמתחילות ב־K או k וממשיכות ב־T:

# awk '/[Kk]T/{print}' /etc/hosts 
Use Awk to Print Matched String in File

ציון תווים בטווח

הבנת תווים עם awk:

  • [0-9] אומר מספר יחיד
  • [a-z] אומר התאמה לאות קטנה יחידה
  • [A-Z] אומר התאמה לאות גדולה יחידה
  • [a-zA-Z] אומר התאמה לאות יחידה
  • [a-zA-Z 0-9] אומר התאמה לאות או מספר יחיד

בואו נסתכל על דוגמה מטה:

awk '/[0-9]/{print}' /etc/hosts 
Use Awk To Print Matching Numbers in File

כל השורה מהקובץ /etc/hosts מכילה לפחות מספר יחיד [0-9] בדוגמה לעיל.

שימוש ב־Awk עם (^) תו מטא

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

# awk '/^fe/{print}' /etc/hosts
# awk '/^ff/{print}' /etc/hosts
Use Awk to Print All Matching Lines with Pattern

שימוש ב־Awk עם ($) תו מטא

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

awk '/ab$/{print}' /etc/hosts
awk '/ost$/{print}' /etc/hosts
awk '/rs$/{print}' /etc/hosts
Use Awk to Print Given Pattern String

שימוש ב־Awk עם (\) תו בריחה

זה מאפשר לך לקחת את התו שאחריו כתו פשוט, כלומר לשקול אותו כפי שהוא.

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

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

awk '//{print}' deals.txt
awk '/$25.00/{print}' deals.txt
awk '/\$25.00/{print}' deals.txt
Use Awk with Escape Character
סיכום

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

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

Source:
https://www.tecmint.com/use-linux-awk-command-to-filter-text-string-in-files/