Awk היא עוצמה עיבוד נתונים שפת תכנות מובנית כמעט לכל * מערכת nix. זה נראה כמו שפת תכנות מטרה כללית על פני השטח, אבל זה בנוי לבצע פעולות קלט ולהפעיל מבוסס על קלט זה. אם אתה צריך לעבד טקסט מבוסס על תנאים מסוימים, אווק יהיה כמעט תמיד לעשות את העבודה מהר יותר מאשר שפה כללית מטרה כמו C. זה גם לפרש, כך למנוע את תהליך הידור ארוכים debugged של שפות הידור.

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

התחביר הבסיסי של אווק

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

 תבנית {action} תבנית קובץ {action} קובץ ... 

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

 awk '/ com / {print $ 0}' 

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

שדות הדפסה

מכיוון ש- awk יכול לזהות ולנתח מפרידי שדות, הוא שימושי להדפסת עמודות או שורות ספציפיות של נתונים. אנו נשתמש בקובץ "/ etc / passwd" עבור דוגמה זו.

 awk -F ": '' {print $ 1} '/ etc / passwd 

תוכנית זו שורה אחת עושה כמה דברים. הדגל -F מציין כי התו הבא ( : בדוגמה זו) צריך להתפרש כמפריד השדות. אווק מדפיסה את השדה הראשון, שצוין על ידי $1 .

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

 awk -F ":" '[הדפס $ 4 "" $ 5} "/ etc / passw 

זה יהיה לייצר פלט שנראה כמו הבאה.

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

 awk -F ":" '{print "process: $ 5 \" \ t \ t "" directory: "$ 6}' / etc / passwd 

זה יהיה להדפיס את הפלט עם תוויות לזיהוי. ואנחנו יכולים פלט את כל זה לקובץ חדש באמצעות caret (>).

 awk -F ":" '{print "process:" $ 5 "\ t \ t" "directory:" $ 6}' / etc / passwd> models.txt 

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

 awk '/^(\+\d{1, 2}\s)?\(?\d{3}\)?[\s.-]\d3_DE\\-]\d{4 } $ / {print} 'אנשי קשר 

הרחבת כוח ההתאמה של הפקודה של Awk

Awk יכול גם לעבד מידע באמצעות מגוון של אופרנדים. זה כולל אופרנדים סטנדרטיים כמו ==, <, >, <=, <= >=, & !=, כמו גם אופרטורים ספציפיים ~ או ~ !~, כלומר "התאמות" ו "לא מתאים" בהתאמה. אופרנדים אלה משמשים בעת השוואת ביטויים רגולריים עם לוגיקה בוליאנית, כמו גם משפטים פרוגרמטיים סטנדרטיים יותר.

דוגמאות פיק פקודות

 אופק '($ 0)> 80' נתונים 

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

 $ 1 == "משתמש" {print} 

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

 $ 5 ~ / root / {print $ 3} 

מדפיס את השדה השלישי כאשר השדה החמישי תואם את הביטוי הרגיל /root/ .

 {if ($ 5! ~ / root /) {print $ 3}} 

כאשר השדה 5 אינו תואם /root/, שדה ההדפסה שלוש. זה משתמש ב C- כמו if משפט, אשר גם תואם awk. פורמט זה מאפשר גמישות רבה יותר למתכנתים שמכירים שפות כלליות.

שמירת סקריפטים בקבצים

סקריפטים Awk ניתן גם לשמור קבצים המאפשרים לך לשמור תוכניות מורכבות יותר:

 awk -f ~ / scripts / data.awk נתונים 

בעת שימוש בדגל -f, אווק מפעיל את התסריט בנתיב הקובץ שצוין, כלומר program.awk . הפקודות באותה תוכנית יעבדו את הקובץ "נתונים".

פעולות ניתן גם להפעיל לפני ואחרי התוכנית, באמצעות BEGIN ו END :

 BEGIN {FS = ":} # מציין כי: הוא מפריד השדות של התוכנית. #operations END {print "סיימת"} # מדפיסה הודעת שמחה עבור המשתמש 

כפי שניתן לראות לעיל, הסמל # מתחיל הערה, שנמשכת עד סוף השורה.

סיכום

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