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

בערוץ הבא תמצאו אוסף טיפים שימושיים ב-Bash והכרות עם כלים שונים שעשויים לחסוך מאמץ ועבודה בכתיבת סקריפטים ומימוש אוטומציות.
Download Telegram
קבוצות תווים Character classes
רמת קושי: #beginners

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

באש מספקת לנו מספר אופציות להשתמש בregex לשימושים שנצרכים לעיתים קרובות בלא לכתוב regex, היכולת הזאת בשפה של באש נקראת Character classes והיא נראית כך [[:alpha:]], לדוגמה.

$ echo "Have a nice day :-)" | tr -d "[[:alpha:]]"
:-)

ביטוי שבוחר את כל האותיות וכפי שניתן לראות כל האותיות נבחרו ונמחקו.
אם נתבונן נראה שכל האותיות נמחקו אבל הרווחים נשארו, והסיבה לכך היא שהורדנו רק אותיות ולא את הרווחים, בשביל להסיר גם את הרווחים ניתן להשתמש בביטוי [:space:] שתופס רווחים.

$ echo "Have a nice day :-)" | tr -d "[[:alpha:][:space:]]"
:-)

במידה ונרצה להפוך את הביטוי ניתן לעשות זאת על ידי ^

$ echo "1 1 root root $" | tr -d "[^[:alpha:]]"
rootroot

בעבר מספיק היה להשתמש בסוגריים מרובעות פעם אחת בשביל לממש את הביטוי לדוגמה [:print:], בגרסאות החדשות יותר של gnu צריכים להכפיל את הסוגריים למימוש הביטוי, וכמובן ניתן להשתמש ביותר מביטוי אחד בתוך סוגריים כפי שראינו לעיל [[:alpha:][:space:]].

להלן רשימה חלקית של הביטויים

[:alpha:] == אותיות
[:digit:] == מספרים
[:space:] == תוים לבנים
[:blank:] == רווחים וטאבים
[:punct:] == תווים מיוחדים
[:alnum:] == [:alpha:][:digit:]
[:graph:] == [:alnum:][:punct:]
[:print:] == [:alnum:][:punct:][:space:]
[:xdigit:] == Hex

#character_classes
#grep
#sed
#regex
#tr

@bash_tips
👍1
חיפוש grep
רמת קושי: #advanced

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

לבצע חיפוש על טקסט ללא רגישות ל case sensitive

$ grep -i "name" file
name: test
Last Name

שימוש בדגלי A / B / C יאפשר לנו להגדיר שלא רק השורה שתואמת את הביטוי תוצג, אלא גם אלו שסביבה, A יחזיר את השורות הבאות לאחר השורה שנמצאה בה התאמה לביטוי, B יחזיר את השורות שקדמו לשורה התואמת לביטוי, C יציג בשווה שורות לפני ואחרי

$ grep -A2 "three" /tmp/test
three
four
five

$ grep -B2 "three" /tmp/test
One
two
three

$ grep -C2 "three" /tmp/test
One
two
three
four
five

הוספת מספרי שורות לתוצאות בהם נמצאה ההתאמה

$ grep -n "three" /tmp/test
3:three

היפוך תוצאות החיפוש, להחזיר רק את מה שאינו תואם לביטוי

$ grep -v "three" /tmp/test
One
two
four
five

בכדי לקבל פונקציולניות מתקדמת ל regex כמו lookbehind, ניתן להשתמש במנוע הregex שתואם את perl, מוכר גם בשם PCRE

$ grep -P

ברירת מחדל grep יחזיר את כל השורה בה נמצא מילה התואמת לביטוי, בכדי לשלוף רק את הרצף שתואם לביטוי ניתן להשתמש בדגל -o

$ grep name Chart.yaml
name: Test

grep -o name Chart.yaml
name

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

$ grep -r "NodePort" sonarqube
sonarqube/k8s/sonarqube-service.yml: type: NodePort
test_env/k8s/backend-service.yml: type: NodePort

בכדי לקבל רק את הנתיב לקובץ שתואם לביטוי, ניתן להשתמש בנוסף בדגל -l

$ grep -rl "NodePort" sonarqube
sonarqube/k8s/sonarqube-service.yml
test_env/k8s/backend-service.yml

וכמובן שאפשר לקבל רק את הקבצים שאינם מכילים את הביטוי על ידי דגל -L

$ grep -rL "NodePort" sonarqube

וכן אתם לא טועים אפשר לממש את אותו הרעיון עם דגל v

$ grep -rlv "NodePort" sonarqube

#grep

@bash_tips
לחפש כשמכווץ zgrep
רמת קושי: #beginners

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

$ zgrep crash /var/log/syslog*
/var/log/syslog.4.gz ...
/var/log/syslog.5.gz ...
/var/log/syslog.9.gz ...
...


#archives
#zgrep
#grep
#zip

@bash_tips