awk בשתי שורות

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

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

1. הבעיה

נתון קובץ המתאר פלט של תוכנית ifconfig. הקובץ מורכב מבלוקים לתיאור ממשקי הרשת של המכונה:

en3: flags=8963 mtu 1500
    options=60
    ether 32:00:18:24:c0:00
    media: autoselect
    status: inactive
p2p0: flags=8843 mtu 2304
    ether 06:38:35:47:96:24
    media: autoselect
    status: inactive

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

2. הקוד

הקוד הבא ב awk מבצע את העבודה:

/^[a-z0-9]+:/ { currfile = substr($1, 0, length($1)-1) }
{ print > currfile }

3. איך זה עובד

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

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

את ההוראות אפשר לשמור בקובץ ואז להפעיל משורת הפקודה:

awk -f app.awk input.txt

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