Bash Tips
982 subscribers
14 photos
4 files
45 links
רוצים להשתמש בלינוקס אבל לא ממש מכירים את הכלים שהיא מספקת לעבודה?

בערוץ הבא תמצאו אוסף טיפים שימושיים ב-Bash והכרות עם כלים שונים שעשויים לחסוך מאמץ ועבודה בכתיבת סקריפטים ומימוש אוטומציות.
Download Telegram
Bash Tips
נענים לאתגר רמת קושי: #advanced האתגר הבא מבוסס על סיפור אמיתי, כמו רוב הטיפים בערוץ 😊. קובץ זיפ הבא מכיל רשימת קבצי דמה PDF של אקורדים לגיטרה בשמות עבריים, שמות הקבצים מורכבים משם הזמר ושם השיר (לרוב), חלק משמות הקבצים הן עם רווח והאחרים עם . או עם _ כמפריד…
פתרון האתגר סדר בחדר
רמת קושי: #beginners

משימה ראשונה
בואו נציץ לרגע במשימה הראשונה של האתגר ונראה מהי.

לבנות את עץ התיקיות על סמך זה ששם הזמר הוא בתחילת שם הקובץ,
שירים שאין להם שם זמר יכנסו לתיקיה בעלת שם השיר, או קומבינציה מוזרה אחרת.

האתגר הראשון בו אנו נתקלים כשאנו נגשים לאתגר הוא חוסר סטנדרטיזציה בשמות הקבצים, אם נעיף רגע מבט על כל הקבצים נשים לב שרוב הקבצים מסודרים כך ששם הזמר מופיע בתחילת שם הקובץ, אם כן בשביל להשיג סדר ראשוני בקבצים נוכל לארגן חלק ניכר מהקבצים על ידי שליפת 2 המילים הראשונות של שם הקובץ וליצור ממנו תיקייה.

וזה בדיוק מה שעושה הקוד הבא

1 for file in *;
2 do
3 sed_expr='s/^[[:punct:][:space:]]//g ; s/[_,-]/ /g'
4 dest="test/$(echo "${file}" | sed "$sed_expr" | cut -f 1-2 -d ' ' )"
5 mkdir -p "$dest"
6 cp "$file" "$dest"
7 done

שורה 1: אוספת את כל הקבצים שבתיקייה ומעבירה קובץ קובץ לעיבוד.
שורה 3 ו 4: מעבירה את שם הקובץ את התהליך הבא שמורכב מ3 חלקים

1. מעבירה את שם הקובץ הבא לפקודת sed
שמחה_פרידמן_עוד_יבוא_היום_אקורדים_קלים.pdf


2. פקודת sed מריצה שני עיבודים כדי ליצור סטנדרט בין כל הקבצים (; הוא חוצץ בין שני הביטויים)
שלב א' היא מסירה את כל התווים המיוחדים והרווחים שמופיעים בתווים הראשונים של הקובץ .
שלב ב' היא מחליפה את תווי _ , - ברווח.
מה שמביא אותנו למצב ששם הקובץ כרגע הוא כך
שמחה פרידמן עוד יבוא היום אקורדים קלים.pdf

3. בחירה של 2 המילים הראשונות, איך זה קורה?
פקודת cut מקבלת פרמטר לפיו היא מפצלת מילים על פי רווח,
ואז אנו מעבירים טווח של מילים אותם אנו רוצים לשלוף, 1-2 אלו שני המילים הראשונות.

אז כרגע בסופו של תהליך שורה 3 נראית כך
dest="test/שמחה פרידמן"

מפה זה די פשוט וקל
שורה 5: יוצרת תיקיית על שם הזמר.
שורה 6: מעתיקה את השיר לתיקייה שכרגע נוצרה.

התוצאה היא רשימת תיקיות שמכילות את שני המילים הראשונות של הקבצים.
קבצים שיש להם את אותם 2 מילים בראש הקובץ מקובצים תחת אותה תיקייה.


עד כאן חלק א' של האתגר
יש לכם רעיונות לשיפור, הערות, טיפים? מוזמנים לשתף בתגובות
בימים הקרובים אפרסם פתרון גם למשימה השניה, עד אז מי שרוצה לאתגר את עצמו מוזמן

#challenge
#loops
#sed
#cut

@bash_tips
לעבוד עם טווח, cut
רמת קושי: #beginners

פקודת cut מאפשרת לבחור תווים או עמודות מהטקסט על ידי אינדקס או טווח

$ echo ABCDEFG | cut -c 3
C

$ echo ABCDEFG | cut -c 3-5
CDE

$ echo ABCDEFG | cut -c 1,3,5
ACE

$ echo ABCDEFG | cut -c 3-
CDEFG

מה היה לנו כאן? דגל c- (characters) מקבל תו/מערך/טווח מתוך טקסט ומחזיר אותו, בדוגמה האחרונה אפשר לראות איך מגדירים את הטווח עד סוף הטקסט מבלי לתת אינדקס ספציפי, צורה העבודה של תווים עובדת כמעט אחד לאחד עם עמודות, מה שמוביל לשאלה הבאה

מהם עמודות אם כך?
זהו בעצם החלק השימושי באמת בפקודה, עמודות הן כל קטע טקסט שנחליט, ברגע שנגדיר עם d (delimiter)- שתו מסויים הוא זה שמפצל את הטקסט, כל הטקסט הופך להיות כעין טבלה דמיונית שאפשר לבחור ממנה מידע על פי מיקום העמודה, וטוב מראה עיניים אז...

$ cat users
name,user id,telegram account
coco,5635634356,no
roni,996873823,yes
tom,7424743356,yes

$ cut -f 1 -d , users
name
coco
roni
tom

$ cut -f 2 -d , users
user id
5635634356
996873823
7424743356

יש לנו קובץ בשם users שמכיל מידע בתצורת CSV (פסיקים שמפרידים בין ערכים), הגדרנו חלוקה לפי תו פסיק ומשם ניתן לבחור איזה עמודה להציג עם ידי העברת אינדקס העמודה לדגל -f

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

$ echo "Good Morning" | cut -f 1 -d ' '
Good

$ echo "Good\nMorning" | cut -f 1 -d '\n'
cut: the delimiter must be a single character
Try 'cut --help' for more information.

וגם כאן כמו בדוגמאות שבתחילת הפוסט, ניתן לבחור מספר עמודות

cut -f 1,3,5 -d ' '

רצף

cut -f 3-5 -d ' '


או מעמודה מסויימת עד העמודה האחרונה

cut -f 3- -d ' '


#cut

@bash_tips
לחלק נכון, awk
רמת קושי: #beginners

לא מעט פעמים אנו נדרשים לקבל פלט ולהוציא ממנו את החלק שרלוונטי אלינו, לצורך העניין הקלט שאנו מנסים לפרסר הוא זה, ואנו רוצים לקבל את העמודה השניה.
$ cat output

one two three
one two three
one two three

הפתרון לבעיה הזאת הוא להשתמש ב cut עליו דיברנו בעבר
הפקודה שלנו תראה משהו כזה כשדגל -d מפצל לפי רווחים ו -f בוחר את מספר "העמודה"

$ cat output | cut -d " " -f2
two
two
two
אחלה, עובד מעולה

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

docker ps | cut -d " " -f 2

במקום לקבל את הפלט של כל סוגי האימג'ים ששל הקונטיינרים מה שנקבל במקום זה את הרווח שלאחר מכן

איך כן?
בכדי לפתור את הבעיה הזאת יהיה קל יותר להשתמש ב awk כדי לפצל פלט

docker ps | awk '{print $2}'

החוקים הם אותו הדבר, רווח או מספר רווחים זה מה שמפצל בין "עמודות" הטקסט
אנו משתמשים בפונקציית print ומספר העמודה כדי להדפיס את העמודה הרצויה לנו


#cut
#awk

@bash_tips
👍17🔥3🥰1