Skip to main content

כיצד לכתוב פקודות AWK וסקריפטים

לינוקס Script - חלק 1 (יוני 2026)

לינוקס Script - חלק 1 (יוני 2026)
Anonim

הפקודה awk היא שיטה רבת עוצמה לעיבוד או ניתוח קובצי טקסט - בפרט, קובצי נתונים המאורגנים על ידי שורות (שורות) ועמודות.

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

הפורמט הבסיסי של פקודת awk נראה כך:

אופק 'תבנית {action}' קובץ קלט> קובץ פלט

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

awk '{print $ 5}' table1.txt> output1.txt

הצהרה זו לוקחת את האלמנט של העמודה החמישית של כל שורה וכותבת אותו בתור שורה בקובץ הפלט "output.txt". המשתנה '$ 4' מתייחס לעמודה השנייה. באופן דומה ניתן לגשת לעמודה הראשונה, השנייה והשלישית, עם $ 1, $ 2, $ 3, וכו '. כברירת מחדל, עמודות מניחות שהן מופרדות על ידי רווחים או טאבים (מה שנקרא חלל לבן). לכן, אם קובץ הקלט "table1.txt" מכיל שורות אלה:

1, ג'סטין טימברלייק, כותרת 545, מחיר $ 7.302, טיילור סוויפט, כותרת 723, מחיר 7.90 $3, מיק ג'אגר, כותרת 610, מחיר 7.90 $4, ליידי גאגא, כותרת 118, מחיר $ 7.305, ג 'וני קאש, כותרת 482, מחיר $ 6.506, אלביס פרסלי, כותרת 335, מחיר $ 7.307, ג'ון לנון, כותרת 271, מחיר 7.90 $8, מייקל ג 'קסון, כותרת 373, מחיר $ 5.50

לאחר מכן הפקודה תכתוב את השורות הבאות לקובץ הפלט "output1.txt":

545,723,610,118,482,335,271,373,

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

awk-F, '{print $ 3}' table1.txt> output1.txt

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

כותרת 545 כותר 723 כותרת 610 כותר 118 כותר 482 כותרת 335 כותר 271 כותר 373

רשימת ההצהרות בתוך הסוגלים המסולסלים ('{{,'} ') נקראת בלוק. אם אתה שם ביטוי תנאי מול גוש, ההצהרה בתוך הבלוק תבוצע רק אם המצב נכון.

awk '$ 7 == " $ 7.30" {print $ 3}' table1.txt

במקרה זה, התנאי הוא $ 7 == " $ 7.30", כלומר האלמנט בעמודה 7 שווה ל 7.30 $. הקו האחורי מאחורי סימן הדולר משמש כדי למנוע מהמערכת לפרש $ 7 כמשתנה ובמקום זאת לקחת את סימן הדולר פשוטו כמשמעו.

אז זה הצהרה awk מדפיס את האלמנט בעמודה 3 של כל שורה שיש לו "$ 7.30" בעמודה 7.

ניתן גם להשתמש בביטויים רגילים כתנאי. לדוגמה:

awk '/ 30 / {print $ 3}' table1.txt

המחרוזת בין שני החרכים ('/') היא הביטוי הרגיל. במקרה זה, זה רק מחרוזת "30." משמעות הדבר היא שאם שורה מכילה את המחרוזת "30", המערכת מדפיסה את האלמנט בעמודה השלישית של הקו. הפלט בדוגמה לעיל יהיה:

טימברלייק, גאגא, פרסלי,

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

awk '{print ($ 2 * $ 3) + $ 7}'

מלבד המשתנים שמקבלים אלמנטים של השורה הנוכחית ($ 1, $ 2, וכו ') ישנו המשתנה $ 0 המתייחס לשורה המלאה (שורה) ולמשתנה NF המחזיק במספר השדות.

ניתן גם להגדיר משתנים חדשים כמו בדוגמה זו:

awk '{sum = 0; עבור (col = 1; col <= NF; col ++) סכום + = $ col; סכום הדפסה; }

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

הצהרות Awk משולבים לעתים קרובות עם פקודות sed.