1 / 68

תרגול 6

תרגול 6. תוכניות שרות סטנדרטיות ב- UNIX C-Shell. לי-טל משיח litalma@cs.technion.ac.il נערך והורחב ע''י ודים אייזנברג. תוכניות שרות סטנדרטיות ב- UNIX. בכל מחשב בו מותקנת מערכת הפעלה מסוג Unix מותקנות בנוסף מספר תוכניות שרות (utilities) סטנדרטיות

Download Presentation

תרגול 6

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. תרגול 6 תוכניות שרות סטנדרטיות ב-UNIX C-Shell לי-טל משיח litalma@cs.technion.ac.il נערך והורחב ע''י ודים אייזנברג

  2. תוכניות שרות סטנדרטיות ב- UNIX • בכל מחשב בו מותקנת מערכת הפעלה מסוג Unixמותקנות בנוסף מספר תוכניות שרות (utilities)סטנדרטיות • בפשטות נקראות גם פקודות (commands)סטנדרטיות • כל משתמש Unix יכול להריץ תוכניות אלה לצרך ביצוע משימות שלו • ב-Unix ניתן לשלב בין תוכניות (שרות ורגילות) בשורת הפקודה בצורה נוחה • לבצע משימות מורכבות יחסית בשורת פקודה אחת • מספר גדול של התוכניות הסטנדרטיות וצורה נוחה של ההרכבהביניהן מקנים כוח רב למשתמש

  3. הפקודה echo echo <parameters> • מדפיסה את הפרמטרים שלה >echo Hello world ! Hello world !

  4. פקודות לעיבוד קבצים • נלמד מספר פקודות לעיבוד קבצים ב-Unix • עיבוד קבצים: • הדפסת תוכן קבצים • הדפסת שורות מסוימות מקבצים • הדפסת קבצים בצורה ממוינת • הדפסת חלקי שורות מקבצים • ספירת שורות, מילים ותווים בקבצים

  5. פורמט של רוב הפקודות לעיבוד קבצים command [options] [input files] • הפקודה מקבלת אופציות(דגלים), בד''כ כלל תו "-" ואות אחת • הפקודה מקבלת אחד או כמה קובצי קלט • אם לא ניתן אף קובץ קלט הפקודה מצפה לקלט מהקלט הסטנדרטי • הפקודה מוציאה את הפלט שלה לפלט הסטנדרטי

  6. הפקודה head head [-N] [input files] • מדפיסה Nהשורות הראשונות מתוך הקלט • ברירת מחדל היא 10 • בהינתן הקבצים • a_file • b_file > head -2 a_file a line 1 a line 2 a line 1 a line 2 a line 3 a line 4 a line 5 > head -1 < b_file b line 1 > head -2 a_fileb_file ==> a_file <== a line 1 a line 2 ==> b_file <== b line 1 b line 2 b line 1 b line 2 b line 3

  7. הפקודה tail tail -N [input files] • מדפיסה Nהשורות האחרונות מתוך הקלט • ברירת המחדל היא 10 tail +N [input files] • מדפיסה השורות האחרונות מתוך הקלט החל מהשורה N > tail -2 a_file a line 4 a line 5 > tail +2 a_file a line 2 a line 3 a line 4 a line 5

  8. משימה פשוטה:להדפיס שורות 2 ו-3 של קובץ • איך עושים את זה בעזרת head ו-tail ? > head -3 > first3 > tail -2 first3 a line 2 a line 3 > rm first3 מסורבל

  9. פתרון פשוט : שילוב בין תוכניות בעזרת pipeline • ב-Unix ניתן לשלבבין תוכניות בעזרת מגנון pipeline: > program1 | program2 | program3 • הפלט הסטנדרטי של command1מחובר לקלט הסטנדרטי של command2 בעזרת סימן 'I' command1 command2 command3 stdout stdin stdout stdin

  10. Pipelining > program1 | program2 | program3 • כל תוכנית ב-pipelineלוקחת כקלט את הפלט של קודמתה, מבצעת את המשימה שלה ומעבירה את הפלט שלה לבאה אחריה בשורה. • פתרון של המשימה הקודמת בשורה אחת: > head -3 a_file | tail -2 a line 2 a line 3

  11. פקודה cat cat file_1 file_2 … file_k • מדפיסה את תוכן הקבצים file_1,file_2,…,file_k לפלט הסטנדרטי אחד אחרי השני • דוגמא : > cat b_filea_file | head -4 b line 1 b line 2 b line 3 a line 1

  12. הפקודה less less <input file> • מציגה את הקובץ על המסך עם ההפסקה אחרי כל דף • ניתן לדפדף קדימה ואחורה בקובץ המוצג בעזרת מקשי החצים • ניתן לחפש מחרוזת על ידי הקשת תו / ואחריו המחרוזת לחיפוש • יוצאים מהפקודה על ידי הקשת :q או Ctrl-c q

  13. התנהגות הפקודה ls • הפקודה ls מדפיסה רשימת קבצים • צורת הפלט שונה בהתאם ליעד הפלט • אם הפלט מיועד למסךls מדפיסה את קבצים בשורות • אם הפלט מיועד לקובץ או ל-pipe, ls מדפיסה את הקבצים אחד בשורה > ls aaaccceee bbbddd > ls | cat aaa bbb ccc ddd eee > ls > out > less out aaa bbb ccc ddd eee

  14. הפקודה tee tee [options][files] • הפקודה משכפלתאת כל מה שנכנס לקלט הסטנדרטי שלה ושולחתאותו הן לפלט הסטנדרטי והן לכל אחד מהקבצים ב [files] • לדוגמא, אם בנוסף להצגת השורה השנייה והשלישית נרצה לשמור את שלוש השורות הראשונות של הקובץ a_fileבשני קבצים שונים, נוכל לבצע : • אופציות נוספות: • האופציה -a מאפשרת שרשור של הפלט לסוף הקבצים [files] במקום מחיקתם. > head –3 a_file | tee file1 file2 | tail –2

  15. תיאור גרפי של הפעולה של tee From http://commons.wikimedia.org/wiki/File:Tee.svg, Creative Commons License

  16. הפקודה tee tee [options][files] • שימו לב שהפקודה tee היא לא בפורמט הסטנדרטי של פקודות לעיבוד קבצים: • היא מקבלת את הקלט רק מהקלט הסטנדרטי • היא מקבלת רשימת הקבצים לפלט, ולא לקלט From http://commons.wikimedia.org/wiki/File:KF_25_Tee.jpg Creative Commons License

  17. הפקודה sort sort [options] [files] • מדפיסה את תוכן הקלט בצורה ממוינת • בררת מחדל: מיון לקסיקוגרפי • אופציות: • -n ממיין בסדר מספרי • -rהופךאת סדר המיון • -k numמתייחסלכל שורה החל ממילה num, המילים ממוספרות החל מ-1 • -f מתעלם מהבדליuppercase/lowercase • -mממזגמספר קבצים שכבר מויינו לקובץ אחד (יותר יעיל מאשר למיין אותם שוב כקובץ אחד) • -b מתעלם מרווחים בתחילת השורה • -d מתעלם מסימני פיסוק

  18. הפקודה sort - דוגמאות > less data World whould for Father > sort data Father World for whould > sort data -f Father for whould World > sort data -r whould for World Father > ls -al total 6 -rw------- 1 romano root 520 Nov 8 23:09 data -rw------- 1 romano 368 43 Nov 8 23:12 ex1 -rw------- 1 romano 368 428 Nov 8 23:22 ex2 -rw------- 1 romano 368 322 Nov 10 13:30 ex3 > ls -al | sort -n -k 5 total 6 -rw------- 1 romano 368 43 Nov 8 23:12 ex1 -rw------- 1 romano 368 322 Nov 10 13:30 ex3 -rw------- 1 romano 368 428 Nov 8 23:22 ex2 -rw------- 1 romano root 520 Nov 8 23:09 data >

  19. סדר מילוני לעומת מספרי • חשובלהבדילבין הסדר המילוני(לקסיקוגרפי) והסדר המספרי > less numbers 22 111 3 > sort numbers 111 22 3 > sort numbers -n 3 22 111

  20. הפקודה grep grep [options] [^]word [files] • מדפיסה שורות בהן מופיעה המילה word • אופציות: • -v הדפס את השורות, בהן לא מופיעה word (פעולה הפוכה) • -i התעלם מהבדלי uppercase/lowercase • -w הדפס את כל השורות בהן מופיעהwordבדיוק(לא כתת מחרוזת)

  21. הפקודה - grepדוגמאות • בהינתן הקובץ • farm1 > grep cow farm1 cow Betsy slim cow Dazy two cows Dartsy & Teo goat Upton cow Betsy slim cow Dazy Fat Cow Burger two cows Dartsy & Teo horse Admiral > grep -v cow farm1 goat Upton Fat Cow Burger horse Admiral > grep -i cow farm1 cow Betsy slim cow Dazy Fat Cow Burger two cows Dartsy & Teo > grep -w cow farm1 cow Betsy slim cow Dazy

  22. הפקודה - grepנקודות נוספות • אם רוצים לחפש שורות בהן מופיע ביטויהמורכב ממספר מילים המופרדות ע"י רווחים, כותבים את הביטוי בין גרשיים: > grep "slim cow" file • כשסימן ^ מופיע לפני המילה, grep מדפיסה את כל השורות המתחילות במילה הזאת: > grep ^cow file

  23. הפקודה - grepדוגמאות • בהינתן הקובץ • farm1 goat Upton cow Betsy slim cow Dazy Fat Cow Burger two cows Dartsy & Teo horse Admiral > grep "slim cow" farm1 slim cow Dazy > grep ^cow farm1 cow Betsy

  24. הפקודה grep - אופציות נוספות • -n הדפס את השורות ואת מספרן בקבצים • -l הדפס רק את שמות הקבצים בהם השורות נמצאו ללא הדפסת השורותעצמן • -c הדפס רק את מספר השורות שנמצאו בכל קובץ ללא הדפסת השורותעצמן

  25. הפקודה - grepדוגמאות > grep cow farm1 farm2 farm1:cow Betsy farm1:slim cow Dazy farm1:two cows Dartsy & Teo farm2:cow Leni farm2:cow Oreo • בהינתן הקבצים • farm1 • farm2 goat Upton cow Betsy slim cow Dazy Fat Cow Burger two cows Dartsy & Teo horse Admiral > 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 sheep Brook cow Leni goat Aster cow Oreo > grep -c cow farm1 farm2 farm1:3 farm2:2

  26. הפקודה uniq uniq [options] [input_file [output_file]] • מדפיסה עותק אחד של כל השורות הזהות הסמוכות • הפלט הולך לקובץ output_file (או בהיעדר הקובץ output_file, לערוץ הפלט הסטנדרטי) • שימו לב שהפקודה uniqהיא לא בפורמט הסטנדרטי של פקודות לעיבוד קבצים: • היא יכולה לקבל את הקלט רק מקובץ אחד • הקובץ השני הוא קובץ הפלט

  27. הפקודה uniq - אופציות • -c הדפס כל שורה פעם אחת בלבד וספור עותקים של כל שורה. • -d הדפס רקשורות המופיעות יותר מפעם אחת • -u הדפס רקשורות המופיעות מפעם אחת בלבד • ניתן להשתמש רק באחת מהאופציות -c/-d/-u בו זמנית • -Nהתעלםמ- “N”המילים הראשונות (לפני קבלת ההחלטה אם שתי שורות זהות)

  28. הפקודה uniq - דוגמאות > less names Uri Dan Uri Elena Alex Ofra Uri Ofra > less file3 one two two three three three one one > uniq file3 list > less list one two three one > > sort names | uniq -c 1 Alex 1 Dan 1 Elena 2 Ofra 3 Uri > sort names | uniq -d Ofra Uri > sort names | uniq Alex Dan Elena Ofra Uri > sort names | uniq -u Alex Dan Elena

  29. הפקודה cut cut options [files] • מדפיסה תוויםאו שדותמכל אחת משורותהקלט • אופציות: • -c list הוצא קבוצת תוויםלפי האינדקסים של התווים בשורה, המופיעים ב-“list” • -f list הוצא קבוצת שדות לפי האינדקסים של השדות בשורה, המופיעים ב-“list”. • שדותבשורה - קבוצות תויםהמופרדותע''יתו מפריד כלשהו. • ברירת מחדל של התו המפריד היא <tab> • -d”c” משמשת בנוסף לאופציה -f ומאפשרת לקבועאת “c”כהתוהמפריד

  30. הפקודה cut - דוגמאות במידה וקיים התו המפריד בשורה אך ניתן מספר שדה שאינו קיים -תודפס שורה ריקה אולם אם התו המפריד לא קיים בשורה, תודפס כל השורה > less file1 a11 a12 a13 a14 a15 b21 b22 b23 b24 b25 c31 c32 c33 c34 c35 > cut -c1-3,5,8-10 file1 a11a a1 b21b b2 c31c c3 > cut -d" " -f2,4 file1 a12 a14 b22 b24 c32 c34 > less file2 a11:a12:a13 b21:b22 c31 c32 c33 > cut -d":" –f1 file2 a11 b21 c31 c32 c33 > cut -d":" –f3 file2 a13 c31 c32 c33

  31. הפקודה wc wc [options] [files] • מדפיסה מספר התווים, המילים או השורות בקלט • אופציות: • -c הדפס את מספר התוויםבלבד. • -l הדפס את מספר השורותבלבד. • -w הדפס את מספר המיליםבלבד.

  32. הפקודה wc - דוגמאות > wc -w war_and_peace 590234 war_and_peace > wc -l war_and_peace 55480 war_and_peace > wc -c war_and_peace 3348543war_and_peace • אם לא משתמשים באף אופציה, הפלט מודפס בפורמטהבא:<# lines> <# words> <# chars> filename • אם הפקודה מופעלת על כמה קבצי קלט, היא מדפיסה גם סיכום: > wc mtm_ex1.h 120 641 4161 mtm_ex1.h > wc mtm_ex1.h parsing_example.c 120 641 4161 mtm_ex1.h 136 692 4543 parsing_example.c 256 1333 8704 total

  33. SHELL • Shell(מעטפת) - תוכנית שמספקת ממשק שורת הפקודה(command line interface) למערכת ההפעלה משתמש תוכנה Shell מערכת הפעלה חומרה

  34. במערכת ההפעלה Unix יש רכיב תוכנה שתפקידו לשמש מנשק בין המשתמש למערכת ההפעלה. שמו של רכיב זה הוא shell. תפקידו של ה Shell הנו לקיים את הקשר עם המשתמש ולקבל ממנו את הפקודות לביצוע. Shells in UNIX • shell היא תוכניתככל התוכניות. ב-Unix קיימות כמה תוכניות shellשונות, שפותחו בזמנים שונים • לכל shell יש סינטקסשונה • לכל shell יש יתרונות וחסרונות משלה • shellsנפוציםב-Unix: cshell,bash, kshell • אנו נלמד על C Shellשהוא אחד ה-shells הפופולאריים • נשתמש בגרסה המורחבת של C shellשנקאתtcsh

  35. Shells in UNIX • איך יודעים מהו ה-shell שרץ עכשיו ? > echo $0 bash • איך עוברים ל-shell אחר ? • פשוט מקישים את שם ה-shell בשורת הפקודה (הרי shell היא תוכנית כמו כל התכניות) > tcsh > echo $0 tcsh

  36. תפקידיו של ה- SHELL • התפקידהראשון של ה-shell הוא לספק ממשקשורת פקודה נוחשמקנה כוח רב למשתמש • במיוחד למשתמש האינטליגנטי • תפקיד נוסף הוא לספק סביבת ריצה לתסריטים - יילמד בתרגול הבא • ה-shell מאפשר • להגדיר כינוייםנוחים לפקודות • לחזור על הפקודות שבוצעו • להתייחס למספר קבצים בצורה קצרה ונוחה • להגדיר משתניםולהשתמש בהם בשורת הפקודה

  37. הפקודה :aliasמנגנון נתינת כינויים לפקודות alias <new name> <command + parameters> • נותנת את השם new name לפקודה command עם הפרמטרים • דוגמאות: > alias cdex1 cd ~mtm/public/0809b/ex1 > cdex1 > alias GCC gcc -std=c99 -Wall -pedantic-errors -Werror -DNDEBUG > GCC hello.c -o hello מתבצע cd ~mtm/public/0809b/ex1 מתבצע gcc -std=c99 -Wall -pedantic-errors -Werror -DNDEBUG hello.c -o hello

  38. הפקודה alias • הפקודה aliasבלי פרמטרים מדפיסה את כל הכינויםהידועים: > alias GCC (gcc -std=c99 -Wall -pedantic-errors -Werror -DNDEBUG) cdex1 (cd /u/023/mtm/public/0809b/ex1) • ניתן לבטלכינוי על ידי הפקודה unalias > unalias GCC > alias cdex1 (cd /u/023/mtm/public/0809b/ex1)

  39. File name expansion • shell מאפשר להתייחס לכמה קבצים ע''י ציון תבנית השמות שלהם • למשל תבנית *.c מתייחסת לכל קבצי .c בתיקייה הנוכחית • רב הפקודות ב-UNIX מקבלות כפרמטרים שמות של כמה קבצים, לכן התכונה הזאת מועילה ביותר • למשל הפקודה*.h grep TODO *.cתדפיס שורות המכילות מחרוזת "TODO" בכל קבצי .h ו-.c בתיקיה הנוכחית • הפקודה gcc *.cתקמפל את כל קבצי .c בתיקיה הנוכחית • נחסכת הקלדה של כל שמות הקבצים

  40. File name expansion • את התבנית בונים בעזרת תווים הנקראים Wildcards • * מתאים לכל מחרוזת תווים באורך אפס או יותר • ? מתאים לכל תו בודד אחד • [] מתאים לכל אחד מהתווים בין [ ל- ] • {} הרחבה למספר מחרוזות • ללא קשר לקבצים בתיקיה a[rxz]b -> arb, axb, azb x{aa,bb,cc}y -> xaay, xbby, xccy

  41. -File name expansionדוגמאות > ls test17.err test17.out test1.in test2.err test2.out test3.in test17.in test1.err test1.out test2.in test3.err test3.out > ls *1* test17.err test17.in test17.out test1.err test1.in test1.out > ls test?.in test1.in test2.in test3.in > ls test[1,3].in test1.in test3.in > ls test[1-3].in test1.in test2.in test3.in > ls test{17,2}.in test17.in test2.in > echo W{hat,e,ant} What We Want

  42. משתנים • ב-CShell ניתן הגדיר משתנים(כמו בשפת C) • להבדיל משפת C, אין צורך להכריז על משתני CShell • המשתנים מוגדריםברגע שמציבים להם ערכים פעם ראשונה set <variable> = <value> • הפקודה set מציבה ערך <value> לתוך משתנה <variable> • בין אם המשתנה היה קיים קודם ובין אם לא, אחריההצבה הוא קיים ומכיל את הערך שהוצב לתוכו

  43. משתנים • להבדיל משפת C, כדי לקרואערך של משתנה לא מספיק לציין את שמו - חייבים להוסיף $לפני השם של משתנה • ניתן לבטל משתנה בצורה מפורשת על ידי הפקודה unset • לא משתמשים בזה לעיתים תכופות > echo $A A: Undefined variable. > set A = 17 > echo $A 17 >echo A A > set A = 777 > echo $A 777 > unset A > echo $A A: Undefined variable.

  44. ערכים של משתנים • להבדיל משפת C, שבה יש כמה טיפוסים של משתנים, ב-CShell יש רק טיפוס אחד • כל משתנה ב-CShell יכול להכיל • מספר שלם • מחרוזת • רשימה > set A = 17 > echo $A 17 > set A = Matam > echo $A Matam

  45. פעולות על משתנים מספריים • ב - CShell ניתן להשתמש במשתנים המכילים מספרים שלמים ולבצע עליהם פעולות חשבון פשוטות • כדי לבצע פעולת חשבון חייבים לשים סימן @ בתחילת השורה • גם בשורות עם @ המשתנה מוגדרברגע שמציבים בו ערך פעם ראשונה > set i = 3 > echo $i 3 > @ i = $i + 1 > echo $i 4 > @ i ++ > echo $i 5 > echo $v v: Undefined variable. > @ v = $i + 12 > echo $v 17

  46. פעולות על משתנים מספריים - רווחים > @i++ @i++: Command not found. • שימו לב: ישלשים רווח • אחרי @ • לרוב, לפני ואחרי כל מספר או משתנה • לא חייבים לפני ואחרי = • לא חייבים לפני ++,-- > @ j = 2+ $i @: Badly formed number. > @ j = $i+ 2 @: Badly formed number. > @ j = 2 +$i @: Variable name must begin with a letter. > @ j = $i +2 @: Variable name must begin with a letter.

  47. פעולות על משתנים מספריים • השמת מספר היא גם פעולת חשבון - ניתן לבצע אותה עם סימן @ • אם מפעילים פעולת חשבון על מחרוזת- מקבלים שגיאה • בפרט עם משתמשים ב-@ להצבת מחרוזת > @ i = 3 > echo $i 3 > set i = Matam > @ i++ @: Expression Syntax. > @ set i = Matam @: Expression Syntax.

  48. פעולות על משתנים מספריים > set i = 1.7 > @ i++ @: Badly formed number. • פעולות חשבון - רק על שלמים • לא ניתן לשלב פעולת חשבון עם פעולה אחרת • אין משמעות ל-pre ו-post ++, כמו ב-C > set i = 7 > @ echo ($i + 2) @: Unknown operator. > echo ($i + 2) (7+2) > @ j = $i++ @: Badly formed number. > @ ++i @: Variable name must begin with a letter.

  49. פעולות על משתנים מספריים - סוגריים > @ i = 2 - 3 + 4 > echo $i -5 • ניתן להשתמש בסוגרייםבפעולות חשבון • שימו לב:האסוציאטיביות אינה סטנדרטית > @ i = (2 - 3) + 4 > echo $i 3

  50. מחרוזות • ב - CShell, כל רצף של תווים נקרא מחרוזת, אולם אם רוצים לעבוד עם מחרוזות המכילות יותר ממילה אחת (מכילות רווחים) יש לתחום אותן בין גרשיים" > set A = abc def ghi > echo $A abc > set A = "abc def ghi" > echo $A abc def ghi

More Related