זה נושא דיון מלווה לערך המקורי ב- https://www.tocode.co.il/bundles/unix1/lessons/filterlab
זה נושא דיון מלווה לערך המקורי ב- https://www.tocode.co.il/bundles/unix1/lessons/filterlab
הי,
קצת רמזים והכוונות כי התרגיל הזה באמת יצא יותר קשה ממה שרציתי. נתחיל עם קבוצת השאלות הראשונה.
כדי להבין איך לשלב פקודות ולבנות מהשילוב משהו גדול יותר כדאי לחלק את הפקודות לסוגים: יש פקודות שמייצרות מידע (למשל ls או ifconfig), יש פקודות שמסננות מידע (למשל grep) ויש פקודות שמארגנות אחרת את המידע.
כל שורת Pipeline שאנחנו צריכים לכתוב תתחיל תמיד בפקודה שמציגה מידע. אם בתרגיל הראשון עלינו להשתמש בפקודות ls
, grep
ו cut
כדי למצוא את מספר הקבצים והתיקיות בעלי מאפיין מסוים אז השורה חייבת להתחיל מ ls:
$ ls
אני ממשיך עם השאלה ורואה שמה שצריך להציג הוא מספר הקבצים והתיקיות עבורם יש הרשאת הרצה למשתמש הנוכחי. בשביל לגרום ל ls להציג את עמודת ההרשאות יש להוסיף את המתג l
וכך נקבל שהפקודה מתחילה ב:
$ ls -l
אבל לאן ממשיכים מכאן?
אז נתבונן רגע בפלט של אותה ls -l:
localhost:wildcards ynonperek$ ls -l
total 0
drw------- 5 ynonperek staff 160 May 7 2017 Doc
drwxr-xr-x 2 ynonperek staff 64 May 7 2017 img
drwxr-xr-x 3 ynonperek staff 96 May 7 2017 include
drwxrwxrwx 2 ynonperek staff 64 Jun 14 2017 lib
drwxr-xr-x 2 ynonperek staff 64 Jun 14 2017 src
-rw-rw-rw- 1 ynonperek staff 0 May 8 2017 um000
-r--r--r-- 1 ynonperek staff 0 May 8 2017 um222
-------r-- 1 ynonperek staff 0 May 8 2017 um662
--------w- 1 ynonperek staff 0 May 8 2017 um664
---------- 1 ynonperek staff 0 May 8 2017 um777
וננסח מחדש את השאלה במונחים של פעולות על טקסט. במקום לשאול בכמה קבצים ותיקיות יש הרשאת הרצה למשתמש הנוכחי נשאל ״בכמה שורות מהפלט מופיעה האות x בתור התו הרביעי של השורה״. שתי השאלות שקולות כי כך ls מדפיסה את הפלט. אבל לשאלה השניה הרבה יותר קל לגשת.
בשביל לדעת בכמה שורות בפלט יש x בתו הרביעי צריך תחילה לגזור את התו הרביעי מהשורה ואז לשאול כמה שורות מכילות את הטקסט x. הפקודה cut
יודעת לעשות את החלק הראשון והפקודה grep
את החלק השני.
תחילה cut
:
$ ls -l | cut -c 4
a
-
x
x
x
x
-
-
-
-
-
חתכה מכל שורה רק את התו הרביעי שהיה בה. את זה אפשר להמשיך ולהעביר ל grep:
$ ls -l | cut -c 4 | grep x
x
x
x
x
כדי להציג רק את השורות בהן כתוב x. ל grep יש גם אופציה להדפיס כמה שורות הוא מצא וזו בדיוק האופציה שאנחנו צריכים כדי לסיים את השאלה:
$ ls -l | cut -c 4 | grep -c x
4
גם בשאר השאלות נרצה לפעול באותה השיטה:
- נאתר איזה פקודה מציגה את כל המידע שאנחנו צריכים, בצורה כזו שאנחנו בעין נוכל לענות על השאלה רק מלראות את הפלט של אותה הפקודה.
- נעבור לתאר את השאלה במונחים של פיענוח טקסטים ונחשוב איזה פעולות על טקסטים צריך לבצע כדי לשלוף את המידע המתאים מתוך הפלט שיש לנו.
- נחפש את הפקדוות והמתגים המתאימים שיעזרו לנו לשלוף את המידע שרצינו.
אשמח לראות כאן גם פיתרונות והצעות שלכם לשאר השאלות
תשובות
2. ls -l | cut -c 4,7,10 | grep -c xxx
3. ls -l | cut -f6,7 -d' ' | grep -c 'Jun 17'
זה עובד לי טוב אבל לא הצלחתי לעשות שזה יעבוד לכל יום ולא רק ל17 ביוני. אני משיג את התאריך של כל יום בשורה הבאה: date | cut -f2,3 -d’ ’ אבל לא הצלחתי להכניס את זה בתוך השורה של התשובה שלי
- לא הצלחתי לעשות grep -x לכן שיניתי את המקף ל-a ואז עשיתי grep
סעיף 1
ls -l |cut -c1,4 | tr - a | grep -c
סעיף 2
ls-l | cut -c 1,4,7,10 | tr - a | grep -c axxx
- לא הצלחתי רשמתי ב3
6.לא הצלחתי לרשום את הפקודה הזאת זה לא הראה לי כלום
-
זה לא עובד, תוכנו של הקובץ נמחק, לדעתי זה יצר קובץ ריק חדש והחליף אותו בישן.
-
לא הצלחתי ולא הבנתי מה הפקודה uniq אומרת.
אשמח להערות ותיקונים,
תודה רבה
הי,
כמה רמזים - קודם כל לגבי התאריך של כל יום כדאי להשתמש בסימן ה $(...)
של bash במצבים כאלה של פקודה בתוך פקודה (זה כמו סימן הגרש הפוך רק יותר יציב). השורה הזאת גם לוקחת את התאריך עם date וגם משבצת אותו בתוך פקודת ה grep:
ls -l | tr -s ' ' | grep "$(date +'%b %d')"
זה נחמד הקטע עם ה grep -x נכון? כי אתה רוצה לצעוק עליו ״מה הבעיה שלך?״. בכל מקרה הבעיה שלו ש -x נראה כמו מתג ואז הוא לא מבין מה אתה רוצה לחפש. יש די הרבה פקודות ביוניקס שיכולות להתבלבל בין ״הדבר שעליו הפקודה צריכה לעבוד״ לבין ״המתגים״ (שמתחילים במינוס). בשביל לפתור את זה המציאו מתג מיוחד שנקרא --
והוא מייצג את המתג האחרון בשורה
לכן הפקודה הבאה עובדת ומחפשת את -x
:
ls -l | cut -c1,4 | grep -- -x
לגבי 6 הפקודה היא:
/sbin/ifconfig
תוכל להדביק פה את מה שניסית לרשום ומה שקיבלת?
-
מעולה. זה בדיוק מה שקרה בגלל שסימן החץ קורה לפני הפעלת הפקודה.
-
מה הכוונה לא הצלחתי? מה קרה כשהפעלת את הפקודה אצלך?
לגבי שאלה 6 זה מה שהוא רושם לי
bash: /sbin/ifconfig: No such file or directory
ותודה רבה על העזרה!!!
אתה ב Ubuntu? או שעובד מתוך ה Windows? אם ב Windows עושה רושם שזה פיצ׳ר יחסית מתקדם ואולי צריך להפעיל אותו בצורה מפורשת. שווה לקרוא כאן:
בכל מקרה לא בטוח ששווה לשבור את השיניים על זה ומקסימום אפשר לדלג על שאלה 6
ls -l | grep “$(date | cut -d” " -f2,3)"