Upload
soleil
View
76
Download
0
Embed Size (px)
DESCRIPTION
תרגול מס' 7. כתיבת תסריטים ב- bash שאלות ממבחנים בקרת תהליכים ב- UNIX. תכניות סטנדרטיות ב- UNIX. grep cut wc tee. head tail sort uniq. echo printf. תכניות סטנדרטיות ב- UNIX. אופי העבודה בטרמינל וקיום כלים נוחים להרכבת פקודות מעודדים יצירת תכניות בסיסיות הניתנות להרכבה - PowerPoint PPT Presentation
Citation preview
7תרגול מס' -כתיבת תסריטים בbashשאלות ממבחנים-בקרת תהליכים בUNIX
2מבוא לתכנות מערכות - 234122
UNIXתכניות סטנדרטיות ב-
grepcutwctee
headtailsortuniq
echoprintf
3מבוא לתכנות מערכות - 234122
UNIXתכניות סטנדרטיות ב- אופי העבודה בטרמינל וקיום כלים נוחים להרכבת פקודות מעודדים יצירת
תכניות בסיסיות הניתנות להרכבה
קיים מגוון בסיסי של תכניות הזמינות בכל מערכת הפעלה ממשפחתUNIX
:צורת ההפעלה של התכניות היא בד"כ מהצורה הבאה
> <command> [options] [input file]לרוב הפקודות, אם לא יצוין קובץ קלט, הקלט ילקח מהקלט הסטנדרטי )למה?(–
בד"כ ניתן להחליף את הסדר בין שם קובץ הקלט לדגלים–
זכרו כי מלבד הדגלים שילמדו כאן ניתן למצוא רשימה מפורטת שלהם ע"יmanשימוש בפקודה
4מבוא לתכנות מערכות - 234122
תזכורת
הפקודהls מדפיסה את הקבצים המבוקשים
> ls [options] [files]אם פלט הפקודה מופנה לקובץ כל קובץ יופיע בשורה נפרדת–
אם מצוינים שמות קבצים ותיקיות כפרמטרים:–
כל קובץ יודפס למסך•
לכל תיקיה יודפס תוכנה•
אם לא מצוינים פרמטרים מלבד דגלים הפקודה פועלת על התיקיה נוכחית–
הפקודהcat מדפיסה את תוכנם של קבצים למסך
> cat [files]אם לא מצוין שם קובץ הקלט נלקח מהקלט הסטנדרטי–
אם מצוינים מספר קבצים הם מודפסים אחד אחרי השני לפלט–
5מבוא לתכנות מערכות - 234122
headהפקודה הפקודהhead:מדפיסה רק את תחילת הקלט
> head [-n#] [files]
השורות הראשונות בקלט#מדפיסה את שורות10אם לא מוגדר מספר יודפסו –
יודפסו כל שליליאם המספר שהוגדר –השורות מלבד # השורות האחרונות
-#עבור מספר חיובי ניתן לרשום גם –
a line 1a line 2a line 3a line 4a line 5
a_file
b line 1b line 2b line 3
b_file
> head –n+2 a_filea line 1a line 2> head –n+1 < b_fileb line 1> head –n-2 a_file b_file==> a_file <==a line 1a line 2a line 3
==> b_file <==b line 1
6מבוא לתכנות מערכות - 234122
tailהפקודה הפקודהtail:מדפיסה רק את סוף הקלט
> tail [-/+#] [files]
מדפיסה את # השורות האחרונות בקלט-#עבור –
מדפיסה החל מהשורה ה-#+#עבור –
השורות האחרונות10ברירת המחדל היא הדפסת –
כיצד נדפיס את שורות– מקובץ מסוים?2-3
a line 1a line 2a line 3a line 4a line 5
a_file
b line 1b line 2b line 3
b_file
> tail -2 a_filea line 4a line 5> tail +2 a_filea line 2a line 3a line 4a line 5> tail -1 a_file b_file==> a_file <==a line 5
==> b_file <==b line 3
> head -3 a_file | tail -2a line 2a line 3
7מבוא לתכנות מערכות - 234122
sortהפקודה הפקודהsort)מדפיסה את הקלט ממוין )לפי שורות
> sort [options] [files]–-nממיינת מספרים לפי ערכם :
–-r)מדפיסה את התוצאות בסדר יורד )ברירת המחדל היא סדר עולה :
–-k##-מתייחס לכל שורה החל מהמילה ה :
1המילים ממסופרות החל מ-•
–-f מתעלם מהבדלי :uppercase/lowercase–-bמתעלם מרווחים בתחילת השורה :
–-sמבצע מיון יציב - שומר על הסדר המקורי בין שורות שערכן שווה :
8מבוא לתכנות מערכות - 234122
sortדוגמאות - > sort dataFatherWorldforwho> sort -f dataFatherforwhoWorld> sort -r datawhoforWorldFathersort -rf dataWorldwhoforFather
> ls -ltotal 4-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 -l | sort -rnk5-rw------- 1 romano root 520 Nov 8 23:09 data-rw------- 1 romano 368 428 Nov 8 23:22 ex2-rw------- 1 romano 368 322 Nov 10 13:30 ex3-rw------- 1 romano 368 43 Nov 8 23:12 ex1total 4
WorldwhoforFather
data
211
numbers> sort numbers112> sort -n numbers211
9מבוא לתכנות מערכות - 234122
uniqהפקודה הפקודהuniqמדפיסה עותק יחיד של שורות זהות סמוכות
> uniq [options] [input [output]]עבור קובץ ממוין שורות זהות לא יודפסו יותר מפעם אחת–
- היא מקבלת את הקלט מקובץ יחיד אינה במבנה הסטנדרטי הפקודה –והארגומנט הנוסף ישמש לקובץ הפלט
–-cמדפיס כל שורה פעם אחת ואת מספר העותקים שלה :
–-dמדפיס רק שורות המופיעות יותר מפעם אחת :
–-uמדפיס רק שורות המופיעות פעם אחת בלבד :
בבת אחתc/-d/-uהאפשרויות מבין -רק באחת ניתן להשתמש •
: התעלם מ-# המילים הראשונות )בקבלת ההחלטה האם שורות זהות(-#–
10מבוא לתכנות מערכות - 234122
uniqדוגמאות - > uniq file3onetwothreeone> uniq file3 list> cat listonetwothreeone> uniq sentencesThis is sparta!It is sparta!Bye bye sparta!> uniq -1 sentencesThis is sparta!Bye bye sparta!> uniq -2 sentencesThis is sparta!
UriDanUriElenaAlexOfraUriOfra
names
onetwotwothreethreethreeoneone
file3> sort names | uniqAlexDanElenaOfraUri> sort names | uniq -uAlexDanElena> sort names | uniq -dOfraUri> sort names | uniq -c 1 Alex 1 Dan 1 Elena 2 Ofra 3 Uri
This is sparta!It is sparta!Bye bye sparta!
sentences
11מבוא לתכנות מערכות - 234122
grepהפקודה הפקודהgrepמחפשת ביטויים בתוך קבצים
> grep [options] <expression> [files]ניתן לחפש מילים מסוימות או ביטויים מורכבים–
מדפיסה את כל השורות בקובץ המכילות את הביטוי שהוגדר–
–-vמדפיסה את השורות בהן לא מופיע הביטוי :
–-i מתעלם מהבדלי :uppercase/lowercase–:-w< מדפיסה את כל השורות בהן expression)מופיע בדיוק )לא כתת מחרוזת >
–-nהדפס את השורות ואת מספרן בקבצים :
–-lהדפס רק את שמות הקבצים בהן נמצאו שורות מתאימות :
–-cהדפס רק את כמות השורות שנמצאו בכל קובץ ללא הדפסת השורות עצמן :
הביטוי לחיפוש יכול להיות מורכב יותר ממילה פשוטה:–
גרשייםכדי לחפש מחרוזת עם רווחים יש להוסיף •
את סוף השורההתו $ מייצג תחילת שורה והתו ^ •
grep של manניתן לחפש ביטויים מורכבים יותר, לשם כך הסתכלו בקובץ ה-•
12מבוא לתכנות מערכות - 234122
grepדוגמאות - > grep cow farm1cow Betsyslim cow Dazytwo cows Dartsy & Teo> grep -v cow farm1goat UptonFat Cow Burgerhorse Admiral> grep -i cow farm1cow Betsyslim cow DazyFat Cow Burgertwo cows Dartsy & Teo> grep -w cow farm1cow Betsyslim cow Dazy> grep "slim cow" farm1slim cow Dazy> grep ^cow farm1cow Betsy
goat Uptoncow Betsyslim cow DazyFat Cow Burgertwo cows Dartsy & Teohorse Admiral
farm1> grep cow farm1 farm2farm1:cow Betsyfarm1:slim cow Dazyfarm1:two cows Dartsy & Teofarm2:cow Lenifarm2:cow Oreo> grep -n cow farm1 farm2farm1:2:cow Betsyfarm1:3:slim cow Dazyfarm1:5:two cows Dartsy & Teofarm2:2:cow Lenifarm2:4:cow Oreo> grep -l cow farm1 farm2farm1farm2> grep -c cow farm1 farm2farm1:3farm2:2> grep o$ farm1two cows Dartsy & Teo
sheep Brookcow Lenigoat Astercow Oreo
farm2
13מבוא לתכנות מערכות - 234122
cutהפקודה הפקודהcut משמשת להפרדת עמודות מתוך הקלט
> cut <options> [files]–-c<list> בשורה המתאימים לאינדקסים המבוקשיםהתווים: הדפס רק את
–-f<list> בשורה המתאימים לאינדקסים המפורטיםהשדות: הדפס רק את
Tabהשדות בשורה מופרדים כברירת מחדל ע"י •אם התו המפריד אינו קיים בשורה תודפס כל השורה•
–-d"?"עבור שימוש באפשרות -תו המפריד : השתמש בתו שהוגדר כ(f)המבוקשים מורכבת ממספר אינדקסים מופרדים רשימת האינדקסים –
בפסיק, כאשר בנוסף ניתן לבקש טווח אינדקסים ע"י שימוש בתו - )מקף(
ומעלה10, ו-6, 5, 2, 1- ידפיס את התווים, c1,2,5-6,10למשל: -•
אם האינדקסים המבוקשים מחוץ לתחום תודפס שורה ריקה–
14מבוא לתכנות מערכות - 234122
cutדוגמאות - > cut -c1-3,5,8-10 file1a11a a1b21b b2c31c c3> cut -d" " -f2,4 file1a12 a14b22 b24c32 c34> cut -d":" –f1 file2a11b21 c31 c32 c33 > cut -d":" –f3 file2a13 c31 c32 c33 > cut -d" " -f-2,4- file1a11 a12 a14 a15b21 b22 b24 b25c31 c32 c34 c35
a11 a12 a13 a14 a15b21 b22 b23 b24 b25c31 c32 c33 c34 c35
file1
a11:a12:a13 b21:b22 c31 c32 c33
file2
15מבוא לתכנות מערכות - 234122
wcהפקודה הפקודהwc משמשת לספירת תווים, מילים או שורת בקלט
> wc [options] [files]–-cמדפיסה את מספר התווים בלבד :
–-lמדפיסה את מספר השורות בלבד :
–-wמדפיסה את מספר המילים בלבד :
מדפיסה אתwcאם לא צוין דגל מסוים –כל שלושת המספרים
אם הפקודה מופעלת על מספר קבצים–שורת סיכוםמודפסת גם
> wc -w war_and_peace590234 war_and_peace> wc -l war_and_peace55480 war_and_peace> wc -c war_and_peace3348543 war_and_peace> wc mtm_ex1.h 120 641 4161 mtm_ex2.h> wc mtm_ex1.h parsing_example.c 120 641 4161 mtm_ex2.h 136 692 4543 parsing_example.c 256 1333 8704 total
16מבוא לתכנות מערכות - 234122
teeהפקודה הפקודהteeמשמשת לשכפול הפלט
> tee [options] [files]משכפלת את הקלט הסטנדרטי ומדפיסה אותו לפלט הסטנדרטי ולכל אחד –
[filesמהקבצים ברשימה ]
–-aמשרשרת לקבצים במקום לכתוב אותם מחדש :
מבנה הפקודה אינו סטנדרטי, היא מקבלת–קלט רק מהקלט הסטנדרטי
> head -3 a_file | tee file1 file2 | tail -2a line 2a line 3> cat file1a line 1a line 2a line 3
17מבוא לתכנות מערכות - 234122
printfהפקודה הפקודהprintf מאפשרת הדפסה מעוצבת של טקסט בדומה לפונקציה
Cב-
> printf <format> [arguments]–%sמציין במחרוזת הפורמט שיש להכניס כאן את ערך הארגומנט הבא :
–]-[%m[.n]s מדפיסה את המחרוזת המתאימה מרשימת המחרוזות כך :
תווים מהמחרוזת. n תווים ותכיל לכל היותר mשהתוצאה תהיה באורך
)מקף(.-אלא אם מופיע מיושרת לימין המחרוזת תהיה
> printf "%s %s! \n" Hello worldHello world!
> printf "%-10s %.5s!\n" Hello world.Hello world!
18מבוא לתכנות מערכות - 234122
- סיכוםUNIXתכניות סטנדרטיות ב-
-ניתן להשתמש במגוון תכניות סטנדרטיות בUnix הפועלות משורת הפקודה ומבצעות פעולות בסיסיות
ניתן להדפיס את תחילת או סוף הקלט ע"יhead-ו tail ניתן למיין את הקלט לפי שורות בעזרתsort ניתן להשמיט שורות זהות בעזרתuniq ניתן לחפש שורות מסוימות בקבצים בעזרתgrep ניתן להפריד עמודות ספציפיות מהקלט בעזרתcut ניתן לספור את מספר המילים והשורות בקלט בעזרתwc ניתן לשכפל את ערוץ הפלט בעזרת הפקודהtee ניתן להדפיס מחרוזות בעזרתprintfו( echo)בתרגול קודם
19מבוא לתכנות מערכות - 234122
שאלות ממבחנים - bash
שימוש בתכניות סטנדרטיות שלUnixבתסריטים
20מבוא לתכנות מערכות - 234122
(21.7.95 )1שאלה
-כתוב תוכנית בbashששמה arrange אשר מעבירה קבצים מהתיקיהלתוך תתי-תיקיות לפי הכללים הבאים:)שאינם תיקיות( הנוכחית
:לכל קובץ שאינו תיקיה האותיות הראשונות 4אם קיימת תת-תיקיה לתיקיה הנוכחית ששמו זהה ל-1.
להעברתבשם הקובץ, הקובץ יועבר לתוך התיקיה. )שים לב שהכוונה הקובץ ולא להעתקתו(.
בתיקיה לפחות שני קבצים נוספים לא מתקיים, וקיימים 1אם תנאי 2. 4 האותיות הראשונות בשמם זהות ל-4הנוכחית שאינם תיקיות, כך ש-
האותיות הראשונות בשם הקובץ, התוכנית תיצור תת-תיקיה חדשה ששמה האותיות הראשונות בשם הקובץ, והקובץ יועבר לתוך תת-תיקיה זו. 4זהה ל-
21מבוא לתכנות מערכות - 234122
( - דוגמה21.7.95 )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 script1 script2 prog
22מבוא לתכנות מערכות - 234122
פתרון
#!/bin/bashfunction 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 fi}
arrange
23מבוא לתכנות מערכות - 234122
פתרוןfor file in `ls` ;do if [[ ! -f $file ]] ; then continue fi dir="`echo $file | cut -c1-4`" dirsNum=`fileCount "$dir"` if (( dirsNum > 2 )) ; then makeDir $dir fi if [[ -d $dir ]] ; then mv $file $dir fidone
arrange
24מבוא לתכנות מערכות - 234122
)מועד ג', אביב 2שאלה 2006)
חברתMoogle שהחליטה זה מכבר לפתוח סניף בחיפה, הכריזה על יום ראיונות בפקולטה ,למדעי המחשב בטכניון )אשר בהם יכולים להשתתף רק בוגרי קורס מת"ם כמובן(.
במהלך הראיונות נוכחים מספר מראיינים ובינהם גם מנהלMoogle..100 ל-0כל מראיין נותן ציון למרואיין בין –
הציון הסופי יקבע ע"י שקלול כל הציונים.–
למנהל יש זכות וטו ולא יתכן כי יתקבל לעבודה מרואיין שהמנהל החליט לא לקבל.–
:בסיום הראיונות כל מראיין מכין קובץ בפורמט הבא על האנשים אותם הוא ראיין<ID> <FULL NAME> <GRADE>
.interviewer name>.gradesהשדות מופרדים זה מזה בטאבים. שם הקובץ הינו >–
דוגמה לקובץ בשםeyal.grades:
הקובץ של מנהלMoogle ייקרא Moogle.grades:ויכול להיראות כך
031243129 Moshe Levi 60444422267 Shimon Cohen 90555782311 David David 100
031243129 Moshe Levi 57555782311 David David -NO-444422267 Shimon Cohen 80
25מבוא לתכנות מערכות - 234122
)מועד ג', אביב 2שאלה 2006)
עליכם לכתוב תסריט בשםBestToWork אשר ינתח את הקבצים הללו ויחזיר את קבוצת המרואיינים הטובים ביותר. התסריט יקבל כפרמטר את מס'
מקומות העבודה הפנויים ויחזיר מס' שכזה של מרואיינים מצטיינים ממויינים לפי מידת ההצלחה.
במקרה שאין מספיק מרואיינים שהתראיינו / עברו את הראיון, תוחזר”not enough intervieweesההודעה: "
:לדוגמה, עבור שני הקבצים שבדוגמה
:הערותהניחו כי קבצי הקלט קיימים ותקינים–
ניתן להניח שאותם מראיינים ראיינו את כל האנשים–
אין להשתמש בקבצים זמניים–
ניתן להשתמש במספר לא מוגבל של תסריטים–
> BestToWork 21) 444422267 Shimon Cohen2) 031243129 Moshe Levi> BestToWork 3not enough interviewees
26מבוא לתכנות מערכות - 234122
פתרון
#!/bin/bashfunction 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 while read -a line; do let total_grade+=${line[3]} done echo $total_grade}
BestToWork
27מבוא לתכנות מערכות - 234122
פתרון
function CalcGrades { while read -a line; do grade=`cat *.grades | grep ${line[0]} | CalcOneGrade` # $line[0] is ID, $line[1] is the first # name, $line[2] is the last name 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 -nrk3 | PrintBest | head -$1fi
BestToWork
28מבוא לתכנות מערכות - 234122
UNIXבקרת תהליכים ב-
הרצה בחזית וברקעפקודות לניהול תהליכים
29מבוא לתכנות מערכות - 234122
Unixריבוי תהליכים ב-Unix( היא מערכת הפעלה התומכת בריבוי תהליכים multi-tasking)
חובה עבור מערכת שנועדה לשירות מספר רב של משתמשים בו זמנית–
תהליך הוא הרצה של תכנית כלשהיניתן להריץ תכנית יחידה במספר תהליכים במקביל–
בניגוד למנשק גרפי בו השליטה במספר תהליכים אינטואיטיבית עבורעבודה בטרמינל יש להכיר מספר פקודות וקיצורים
30מבוא לתכנות מערכות - 234122
הרצה בחזית וברקעShellיחיד יכול להריץ מספר תהליכים בו זמנית
כל התהליכים מדפיסים את הפלט שלהם לערוצי הפלט הסטנדרטיים–
רק תהליך אחד יכול להשתמש בערוץ הקלט הסטנדרטי–
רץ בחזיתתהליך אשר מקושר לערוץ הקלט הסטנדרטיכדי להריץ תהליך בחזית יש להפעילו כרגיל–
> command ולא ניתן להכניס פקודות חדשותpromptכל עוד תהליך רץ בחזית אין גישה ל-–
רצים ברקעתהליכים שאינם מקושרים לקלט הסטנדרטיניתן להריץ תהליך ברקע על ידי הוספת & לסוף הפקודה–
> command &
במצב זה התהליך אינו רץ אך מצבו נשמר בזיכרון מושההתהליך יכול להיות גם ,ונוכל להמשיך את הרצתו כשנרצה
31מבוא לתכנות מערכות - 234122
בדיקת מצב תהליכים
הפקודהjobs-מדפיסה את רשימת התהליכים המורצים תחת ה Shell> jobs
לכל תהליך מוצג מספר מזהה, מצבו ושם הפקודה-מייצג את התהליך "הנוכחי"+סימן ה
תהליך זה יהווה את ברירת המחדל לפקודות טיפול בתהליכים–
-מייצג את התהליך הבא בתור להיות +-סימן ה
#!/bin/bashwhile [[ true ]]; do sleep 1 echo Loop $1!done
loop> ./loop 1 &[1] 3692> Loop 1!./loop 2 &[2] 3711Loop 2!Loop 1!
כאשר מספר תהליכים מוציאים פלט בו זמנית
הטרמינל מתבלגן במהירות
המספר בסוגריים המרובעים הוא מספר
Shellהתהליך תחת ה-
32מבוא לתכנות מערכות - 234122
שליחת אותות לתהליך בחזית
כדי לשנות את מצב הריצה של התהליך הרץ בחזית ניתן לשלוח אותותבעזרת קיצורים מהמקלדת
Ctrl+Cהורג )מפסיק( את התהליך אשר בחזית :
Ctrl+Zמשהה את התהליך אשר בחזית :התהליך מפסיק לרוץ אך מצבו נשמר–
33מבוא לתכנות מערכות - 234122
פקודות לניהול תהליכים
ניתן להחזיר תהליך לריצה בחזית בעזרתfg> fg [process]
ניתן להחזיר תהליך לריצה ברקע בעזרתbg> bg [process]
ניתן להשהות תהליך על ידיsuspend > suspend <process>
ניתן להרוג תהליך על ידי הפקודהkill> kill <process>
% ניתן לציין מספר תהליך ע"י –
<str%>< ע"י strניתן להריץ את התהליך ששמו מתחיל ב->–
אם קיימים שני תהליכים מתאימים הפקודה תיכשל•
+: אם לא צוין מספר תהליך יוחזר התהליך שמסומן ב-bg ו-fgעבור –
34מבוא לתכנות מערכות - 234122
- סיכוםUnixבקרת תהליכים ב-
ריצה בחזית מושהה
ריצה ברקע
מופסק
Ctrl+Z
fg
fg
kill
kill
Ctrl+C bg
suspend
הרצה רגילה
& הרצה עם