קבוצות תווים
באש מספקת לנו מספר אופציות להשתמש בregex לשימושים שנצרכים לעיתים קרובות בלא לכתוב regex, היכולת הזאת בשפה של באש נקראת Character classes והיא נראית כך
אם נתבונן נראה שכל האותיות נמחקו אבל הרווחים נשארו, והסיבה לכך היא שהורדנו רק אותיות ולא את הרווחים, בשביל להסיר גם את הרווחים ניתן להשתמש בביטוי [:space:] שתופס רווחים.
להלן רשימה חלקית של הביטויים
#grep
#sed
#regex
#tr
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
חיפוש
לבצע חיפוש על טקסט ללא רגישות ל case sensitive
ניתן לחפש ביטוי על מספר רב של קבצים, גם כאלו במבנה היררכי
כל שורה תכיל את הנתיב לקובץ שהכיל את ההתאמה ואת ההתאמה
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
#grep
#zip
@bash_tips
zgrep
רמת קושי: #beginners לא פעם אנו צריכים לחפש טקסט בערימה של קבצי זיפ, במקום לפתוח קובץ קובץ ולחפש בתוכן, ניתן להשתמש בפקודת
zgrep
שעובדת אותו הדבר כמו grep רק בלי הצורך לחלץ את הקבצים לפני כן $ zgrep crash /var/log/syslog*#archives
/var/log/syslog.4.gz ...
/var/log/syslog.5.gz ...
/var/log/syslog.9.gz ...
...
#zgrep
#grep
#zip
@bash_tips