המצגת נטענת. אנא המתן

המצגת נטענת. אנא המתן

תכניות סטנדרטיות ב- UNIX שאלות ממבחנים

מצגות קשורות


מצגת בנושא: "תכניות סטנדרטיות ב- UNIX שאלות ממבחנים"— תמליל מצגת:

1 תכניות סטנדרטיות ב- UNIX שאלות ממבחנים
תרגול מס' 7 תכניות סטנדרטיות ב- UNIX שאלות ממבחנים

2 תכניות סטנדרטיות נוספות ב-UNIX
cut wc tee echo printf head tail sort uniq grep מבוא לתכנות מערכות

3 תכניות סטנדרטיות ב-UNIX
אופי העבודה בטרמינל וקיום כלים נוחים להרכבת פקודות מעודדים יצירת תכניות בסיסיות הניתנות להרכבה קיים מגוון בסיסי של תכניות הזמינות בכל מערכת הפעלה ממשפחת UNIX צורת ההפעלה של התכניות היא בד"כ מהצורה הבאה: > <command> [options] [input file] לרוב הפקודות, אם לא יצוין קובץ קלט, הקלט ילקח מהקלט הסטנדרטי (למה?) בד"כ ניתן להחליף את הסדר בין שם קובץ הקלט לדגלים זכרו כי מלבד הדגלים שילמדו כאן ניתן למצוא רשימה מפורטת שלהם ע"י שימוש בפקודה man לקיחת הקלט מהקלט הסטנרטי נועדה כמובן כדי לאפשר את הרכבת הפקודות ב-pipeline. מבוא לתכנות מערכות

4 תזכורת הפקודה ls מדפיסה את הקבצים המבוקשים > ls [options] [files]
אם פלט הפקודה מופנה לקובץ כל קובץ יופיע בשורה נפרדת אם מצוינים שמות קבצים ותיקיות כפרמטרים: כל קובץ יודפס למסך לכל תיקיה יודפס תוכנה אם לא מצוינים פרמטרים מלבד דגלים הפקודה פועלת על התיקיה נוכחית הפקודה cat מדפיסה את תוכנם של קבצים למסך > cat [files] אם לא מצוין שם קובץ הקלט נלקח מהקלט הסטנדרטי אם מצוינים מספר קבצים הם מודפסים אחד אחרי השני לפלט מבוא לתכנות מערכות

5 הפקודה head הפקודה head מדפיסה רק את תחילת הקלט:
> head [-n#] [files] מדפיסה את # השורות הראשונות בקלט אם לא מוגדר מספר יודפסו 10 שורות אם המספר שהוגדר שלילי יודפסו כל השורות מלבד # השורות האחרונות עבור מספר חיובי ניתן לרשום גם -# > head –n+2 a_file a line 1 a line 2 > head –n+1 < b_file b line 1 > head –n-2 a_file b_file ==> a_file <== a line 3 ==> b_file <== a line 1 a line 2 a line 3 a line 4 a line 5 a_file b line 1 b line 2 b line 3 b_file מבוא לתכנות מערכות

6 הפקודה tail הפקודה tail מדפיסה רק את סוף הקלט:
> tail [-n+/-#] [files] עבור –n-# מדפיסה את # השורות האחרונות בקלט עבור קובץ בודד, ניתן להשמיט את ה"-n". עבור -n+# מדפיסה החל מהשורה ה-# ברירת המחדל היא הדפסת 10 השורות האחרונות כיצד נדפיס את שורות 2-3 מקובץ מסוים? > tail -2 a_file a line 4 a line 5 > tail -n+2 a_file a line 2 a line 3 > tail -n-1 a_file b_file ==> a_file <== ==> b_file <== b line 3 a line 1 a line 2 a line 3 a line 4 a line 5 a_file b line 1 b line 2 b line 3 b_file > head –n+3 a_file | tail -2 a line 2 a line 3 מבוא לתכנות מערכות

7 הפקודה sort הפקודה sort מדפיסה את הקלט ממוין (לפי שורות)
> sort [options] [files] -n: ממיינת מספרים לפי ערכם -r: מדפיסה את התוצאות בסדר יורד (ברירת המחדל היא סדר עולה) -k#: מתייחס לכל שורה החל מהמילה ה-# המילים ממסופרות החל מ-1 -f: מתעלם מהבדלי uppercase/lowercase בחלק מהמימושים של sort ההתעלמות היא ברירת המחדל -b: מתעלם מרווחים בתחילת השורה -s: מבצע מיון יציב - שומר על הסדר המקורי בין שורות שערכן שווה מבוא לתכנות מערכות

8 sort - דוגמאות World who for Father data 2 11 numbers > sort data
> sort -f data > sort -r data sort -rf data > sort numbers 11 2 > sort -n numbers World who for Father data 2 11 numbers > ls -l total 4 -rw romano root Nov 8 23:09 data -rw romano Nov 8 23:12 ex1 -rw romano Nov 8 23:22 ex2 -rw romano Nov 10 13:30 ex3 > ls -l | sort -rnk5 מבוא לתכנות מערכות

9 הפקודה uniq הפקודה uniq מדפיסה עותק יחיד של שורות זהות סמוכות
> uniq [options] [input [output]] עבור קובץ ממוין שורות זהות לא יודפסו יותר מפעם אחת הפקודה אינה במבנה הסטנדרטי - היא מקבלת את הקלט מקובץ יחיד והארגומנט הנוסף ישמש לקובץ הפלט -c: מדפיס כל שורה פעם אחת ואת מספר העותקים שלה -d: מדפיס רק שורות המופיעות יותר מפעם אחת -u: מדפיס רק שורות המופיעות פעם אחת בלבד ניתן להשתמש רק באחת האפשרויות מבין -c/-d/-u בבת אחת -#: התעלם מ-# המילים הראשונות (בקבלת ההחלטה האם שורות זהות) מבוא לתכנות מערכות

10 uniq - דוגמאות one two three file3 Uri Dan Elena Alex Ofra names
> uniq file3 one two three one > uniq file3 list > cat list > uniq sentences This is sparta! It is sparta! Bye bye sparta! > uniq -1 sentences > uniq -2 sentences > sort names | uniq Alex Dan Elena Ofra Uri > sort names | uniq -u Alex > sort names | uniq -d > sort names | uniq -c 1 Alex 1 Dan 1 Elena 2 Ofra 3 Uri one two three file3 Uri Dan Elena Alex Ofra names This is sparta! It is sparta! Bye bye sparta! sentences מבוא לתכנות מערכות

11 הפקודה grep הפקודה grep מחפשת ביטויים בתוך קבצים
> grep [options] <expression> [files] ניתן לחפש מילים מסוימות או ביטויים מורכבים מדפיסה את כל השורות בקובץ המכילות את הביטוי שהוגדר -v: מדפיסה את השורות בהן לא מופיע הביטוי -i: מתעלם מהבדלי uppercase/lowercase :-w מדפיסה את כל השורות בהן <expression> מופיע בדיוק (לא כתת מחרוזת) השימוש ב-w מפריד בין expression לשאר המחרוזת בעזרת כל תו שאינו אותיות או מספרים. -n: הדפס את השורות ואת מספרן בקבצים -l: הדפס רק את שמות הקבצים בהן נמצאו שורות מתאימות -c: הדפס רק את כמות השורות שנמצאו בכל קובץ ללא הדפסת השורות עצמן הביטוי לחיפוש יכול להיות מורכב יותר ממילה פשוטה: כדי לחפש מחרוזת עם רווחים יש להוסיף גרשיים התו ^ מייצג תחילת שורה והתו $ את סוף השורה ניתן לחפש ביטויים מורכבים יותר, לשם כך הסתכלו בקובץ ה-man של grep מבוא לתכנות מערכות

12 grep - דוגמאות farm1 goat Upton cow Betsy slim cow Dazy Fat Cow Burger
> grep cow farm1 cow Betsy slim cow Dazy two cows Dartsy & Teo > grep -v cow farm1 goat Upton Fat Cow Burger horse Admiral > grep -i cow farm1 > grep -w cow farm1 > grep "slim cow" farm1 > grep ^cow farm1 > grep cow farm1 farm2 farm1:cow Betsy farm1:slim cow Dazy farm1:two cows Dartsy & Teo farm2:cow Leni farm2:cow Oreo > grep -n cow farm1 farm2 farm1:2:cow Betsy farm1:3:slim cow Dazy farm1:5:two cows Dartsy & Teo farm2:2:cow Leni farm2:4:cow Oreo > grep -l cow farm1 farm2 farm1 farm2 > grep -c cow farm1 farm2 farm1:3 farm2:2 > grep o$ farm1 two cows Dartsy & Teo goat Upton cow Betsy slim cow Dazy Fat Cow Burger two cows Dartsy & Teo horse Admiral farm1 sheep Brook cow Leni goat Aster cow Oreo farm2 מבוא לתכנות מערכות

13 הפקודה cut הפקודה cut משמשת להפרדת עמודות מתוך הקלט
> cut <options> [files] -c<list>: הדפס רק את התווים בשורה המתאימים לאינדקסים המבוקשים -f<list>: הדפס רק את השדות בשורה המתאימים לאינדקסים המפורטים השדות בשורה מופרדים כברירת מחדל ע"י Tab אם התו המפריד אינו קיים בשורה תודפס כל השורה -d"?": השתמש בתו שהוגדר כתו המפריד (עבור שימוש באפשרות -f) רשימת האינדקסים המבוקשים מורכבת ממספר אינדקסים מופרדים בפסיק, כאשר בנוסף ניתן לבקש טווח אינדקסים ע"י שימוש בתו - (מקף) למשל: -c1,2,5-6,10- ידפיס את התווים, 1, 2, 5, 6, ו-10 ומעלה אם האינדקסים המבוקשים מחוץ לתחום תודפס שורה ריקה מבוא לתכנות מערכות

14 cut - דוגמאות file1 a11 a12 a13 a14 a15 b21 b22 b23 b24 b25
> cut -c1-3,5,8-10 file1 a11a a1 b21b b2 c31c c3 > cut -d" " -f2,4 file1 a12 a14 b22 b24 c32 c34 > cut -d":" –f1 file2 a11 b21 c31 c32 c33 > cut -d":" –f2-3 file2 a12:a13 b22 > cut -d" " -f-2,4- file1 a11 a12 a14 a15 b21 b22 b24 b25 c31 c32 c34 c35 a11 a12 a13 a14 a15 b21 b22 b23 b24 b25 c31 c32 c33 c34 c35 file1 a11:a12:a13 b21:b22 c31 c32 c33 file2 מבוא לתכנות מערכות

15 הפקודה wc הפקודה wc משמשת לספירת תווים, מילים או שורת בקלט
> wc [options] [files] -c: מדפיסה את מספר התווים בלבד -l: מדפיסה את מספר השורות בלבד -w: מדפיסה את מספר המילים בלבד אם לא צוין דגל מסוים wc מדפיסה את כל שלושת המספרים אם הפקודה מופעלת על מספר קבצים מודפסת גם שורת סיכום > wc -w war_and_peace war_and_peace > wc -l war_and_peace 55480 war_and_peace > wc -c war_and_peace war_and_peace > wc mtm_ex2.h mtm_ex2.h > wc mtm_ex2.h parsing_example.c parsing_example.c total מבוא לתכנות מערכות

16 הפקודה tee הפקודה tee משמשת לשכפול הפלט > tee [options] [files]
-a: משרשרת לקבצים במקום לכתוב אותם מחדש מבנה הפקודה אינו סטנדרטי, היא מקבלת קלט רק מהקלט הסטנדרטי > head -3 a_file | tee file1 file2 | tail -2 a line 2 a line 3 > cat file1 a line 1 From Creative Commons License מבוא לתכנות מערכות

17 הפקודה printf הפקודה printf מאפשרת הדפסה מעוצבת של טקסט בדומה לפונקציה ב-C > printf <format> [arguments] %s: מציין במחרוזת הפורמט שיש להכניס כאן את ערך הארגומנט הבא %[-]m[.n]s: מדפיסה את המחרוזת המתאימה מרשימת המחרוזות כך שהתוצאה תהיה באורך m תווים ותכיל לכל היותר n תווים מהמחרוזת. המחרוזת תהיה מיושרת לימין אלא אם מופיע - (מקף). > printf "%s %s! \n" Hello world Hello world! > printf "%-10s %.5s\n" Hello world. Hello world אם יש יותר ארגומנטים מהדרוש ברשימה, הפונקציה תדפיס את השורה מחדש ותשתמש בארגומנטים הבאים בכל פעם עד אשר הם ייגמרו. printf נועדה להחליף את echo בגלל יכולות יותר מתקדמות לעיצוב טקסט, ובגלל מימושים שונים של echo לאורך השנים שפעלו בצורות שונות ניגוד לסטנדרטים. מבוא לתכנות מערכות

18 הפקודה find הפקודה find מחפשת קבצים בתוך תיקיות באופן רקורסיבי:
find [starting directories] <matching criteria< >actions> הפקודה find תתחיל לחפש החל מתיקיות ההתחלה שצוינו בפקודה ותמשיך לכל תתי התיקיות שבתוכן. ניתן לציין יותר מתיקיית התחלה אחת לחיפוש אם לא צויין שם של תיקייה לחיפוש, החיפוש יתחיל מהתקייה הנוכחית קרטריון חיפוש : -name – חיפוש כל הקבצים בעלי שם מסוים (ניתן גם לרשום ביטויים מורכבים הכוללים תבניות) -user – חיפוש כל הקבצים השייכים למשתמש מסוים -size - חיפוש כל הקבצים בעלי גודל מסוים פעולות : -print – הדפסת המסלול המלא של כל הקבצים שנמצאו -exec cmd – ביצוע הפקודה cmd על כל הקבצים שנמצאו. יש לסיים את השורה עם התווים : {} \; מבוא לתכנות מערכות

19 find - דוגמאות ~mtm/public/1516b/ex2 apartment.c apartment.h
> find –name moedA1516b.word -print ./moedA1516b.word > find . –name \*.word -print ./moedA1516b_sol.word ./moedB1516b_sol.word ./moedB1516b.word > find . ~mtm/public/1516b/ex2 \*.c -print ./code_files/Q1.c ./code_files/Q2.c ./code_files/Kimhi.c ~mtm/public/1516b/ex2/apartment.c ~mtm/public/1516b/ex2/customer.c ~mtm/public/1516b/ex2/agent.c ~mtm/public/1516b/ex2/Solution/agent_sol.c ~mtm/public/1516b/ex2/Solution/customer_sol.c ~mtm/public/1516b/ex2/Solution/apartment_sol.c apartment.c apartment.h customer.c customer.h agent.c agent.h README.txt Solution ~mtm/public/1516b/ex2 moedA1516b.word moedA1516b_sol.word moedB1516b.word moedB1516b_sol.word /code_files התקייה הנוכחית: apartment_sol.c apartment_sol.h customer_sol.c customer_sol.h agent_sol.c agent_sol.h ~mtm/public/1516b/ex2/Solution Q1.c Q2.c Kimhi.c ./code_files מבוא לתכנות מערכות

20 find - דוגמאות ~mtm/public/1516b/ex2 התקייה הנוכחית: moedA1516b.word
apartment.c apartment.h customer.c customer.h agent.c agent.h README.txt Solution ~mtm/public/1516b/ex2 > find . ~mtm/public/1516b/ex2 \*_sol.* -print ./moedA1516b_sol.word ./moedB1516b_sol.word ~mtm/public/1516b/ex2/Solution/agent_sol.h ~mtm/public/1516b/ex2/Solution/agent_sol.c ~mtm/public/1516b/ex2/Solution/customer_sol.c ~mtm/public/1516b/ex2/Solution/customer_sol.h ~mtm/public/1516b/ex2/Solution/apartment_sol.h ~mtm/public/1516b/ex2/Solution/apartment_sol.c > find . ~mtm/public/1516b/ex2 \*_sol.* -exec rm {} \; > ls code_files moedA1516b.word moedB1516b.word > ls ~mtm/public/1516b/ex2/Solution > moedA1516b.word moedA1516b_sol.word moedB1516b.word moedB1516b_sol.word /code_files התקייה הנוכחית: apartment_sol.c apartment_sol.h customer_sol.c customer_sol.h agent_sol.c agent_sol.h ~mtm/public/1516b/ex2/Solution Q1.c Q2.c Kimhi.c ./code_files מבוא לתכנות מערכות

21 תכניות סטנדרטיות ב-UNIX - סיכום
ניתן להדפיס את תחילת או סוף הקלט ע"י head ו-tail ניתן למיין את הקלט לפי שורות בעזרת sort ניתן להשמיט שורות זהות בעזרת uniq ניתן לחפש שורות מסוימות בקבצים בעזרת grep ניתן להפריד עמודות ספציפיות מהקלט בעזרת cut ניתן לספור את מספר המילים והשורות בקלט בעזרת wc ניתן לשכפל את ערוץ הפלט בעזרת הפקודה tee ניתן להדפיס מחרוזות בעזרת printf מבוא לתכנות מערכות

22 שימוש בתכניות סטנדרטיות של Unix בתסריטים
שאלות ממבחנים - bash שימוש בתכניות סטנדרטיות של Unix בתסריטים מבוא לתכנות מערכות

23 שאלה 1 ( ) כתוב תכנית ב-bash ששמהarrange אשר מעבירה קבצים מהתיקיה הנוכחית (שאינם תיקיות) לתוך תתי-תיקיות לפי הכללים הבאים: לכל קובץ שאינו תיקיה: אם קיימת תת-תיקיה לתיקיה הנוכחית ששמו זהה ל-4 האותיות הראשונות בשם הקובץ, הקובץ יועבר לתוך התיקיה. (שים לב שהכוונה להעברת הקובץ ולא להעתקתו). אם תנאי 1 לא מתקיים, וקיימים לפחות שני קבצים נוספים בתיקיה הנוכחית שאינם תיקיות, כך ש-4 האותיות הראשונות בשמם זהות ל-4 האותיות הראשונות בשם הקובץ, התוכנית תיצור תת-תיקיה חדשה ששמה זהה ל-4 האותיות הראשונות בשם הקובץ, והקובץ יועבר לתוך תת-תיקיה זו. מבוא לתכנות מערכות

24 שאלה 1 ( ) - דוגמה במדריך הנוכחי קיימים הקבצים הבאים: file1 file2 file3 prog1 prog2 prog script1 script2 כאשר רק הקובץ prog הינו תיקיה לאחר הפעלת התוכנית arrange בתיקיה הנוכחית, יהיו הקבצים הבאים בתיקיה זו: file script1 script2 prog כאשר: file ו – prog הינם תיקיות בתיקיה file יהיו הקבצים file1 file2 file3 בתיקיה prog יהיו הקבצים prog1 ו - prog2 (בנוסף לקבצים שהיו בתוכו לפני הפעלת התוכנית arrange). file1 file2 file3 script1 script2 prog prog1 prog2 file1 file2 file3 prog1 prog2 file script script prog מבוא לתכנות מערכות

25 פתרון arrange #!/bin/bash function files { for f in `ls`; do
if [[ -f $f ]]; then echo $f fi done } function fileCount { line=( `files | cut -c1-4 | sort | uniq -c | grep $1` ) echo ${line[0]} function makeDir { if [[ ! -d $1 ]] ; then mkdir $1 arrange מבוא לתכנות מערכות

26 פתרון arrange for file in `ls` ;do if [[ ! -f $file ]] ; then continue
dirOfFile="`echo $file | cut -c1-4`" numOfFiles=`fileCount "$dirOfFile"` if (( numOfFiles > 2 )) ; then makeDir $dirOfFile if [[ -d $dirOfFile ]] ; then mv $file $ dirOfFile done arrange לכל קובץ, נבדוק האם קיימים מספיק קבצים עם אותם 4 אותיות בתחילת השם. אם כן, ניצור תיקייה מתאימה. לאחר מכן, אם יש תיקייה מתאימה (בין אם נוצרה או הייתה קיימת) נזיז את הקובץ לתיקייה. מבוא לתכנות מערכות

27 שאלה 2 (מועד ג', אביב 2006) חברת Moogle, שהחליטה זה מכבר לפתוח סניף בחיפה, הכריזה על יום ראיונות בפקולטה למדעי המחשב בטכניון (אשר בהם יכולים להשתתף רק בוגרי קורס מת"ם כמובן). במהלך הראיונות נוכחים מספר מראיינים ובינהם גם מנהל Moogle. כל מראיין נותן ציון למרואיין בין 0 ל-100. הציון הסופי יקבע ע"י שקלול כל הציונים. למנהל יש זכות וטו ולא יתכן כי יתקבל לעבודה מרואיין שהמנהל החליט לא לקבל. בסיום הראיונות כל מראיין מכין קובץ בפורמט הבא על האנשים אותם הוא ראיין: <ID> <FULL NAME> <GRADE> השדות מופרדים זה מזה בטאבים. שם הקובץ הינו <interviewer name>.grades. דוגמה לקובץ בשם eyal.grades: הקובץ של מנהל Moogle ייקרא Moogle.grades ויכול להיראות כך: Moshe Levi 60 Shimon Cohen 90 David David 100 Moshe Levi 57 David David -NO- Shimon Cohen 80 מבוא לתכנות מערכות

28 שאלה 2 (מועד ג', אביב 2006) עליכם לכתוב תסריט בשם BestToWork אשר ינתח את הקבצים הללו ויחזיר את קבוצת המרואיינים הטובים ביותר. התסריט יקבל כפרמטר את מס' מקומות העבודה הפנויים ויחזיר מס' שכזה של מרואיינים מצטיינים ממויינים לפי מידת ההצלחה. במקרה שאין מספיק מרואיינים שהתראיינו / עברו את הראיון, תוחזר ההודעה: "not enough interviewees” לדוגמה, עבור שני הקבצים שבדוגמה: הערות: הניחו כי קבצי הקלט קיימים ותקינים ניתן להניח שאותם מראיינים ראיינו את כל האנשים אין להשתמש בקבצים זמניים ניתן להשתמש במספר לא מוגבל של תסריטים > BestToWork 2 1) Shimon Cohen 2) Moshe Levi > BestToWork 3 not enough interviewees מבוא לתכנות מערכות

29 פתרון BestToWork #!/bin/bash function PrintBest { local num=1
while read -a line; do echo "${num}) ${line[0]} ${line[1]} ${line[2]}" let num++ done } function CalcOneGrade { local total_grade=0 let total_grade+=${line[3]} echo $total_grade BestToWork מבוא לתכנות מערכות

30 פתרון BestToWork function CalcGrades { while read -a line; do
grade=`cat *.grades | grep ${line[0]} | CalcOneGrade` echo ${line[0]} ${line[1]} ${line[2]} $grade done } if (( `cat Moogle.grades | grep -v "\-NO\-" | wc -l` < $1 )) ; then echo "not enough interviewees" else cat Moogle.grades | grep -v "\-NO\-" | CalcGrades | \ sort –nrk4 | PrintBest | head -$1 fi BestToWork מבוא לתכנות מערכות


הורד את "ppt "תכניות סטנדרטיות ב- UNIX שאלות ממבחנים

מצגות קשורות


מודעות Google