אני רוצה לספר לכם על כלי חיפוש אחד שמפשט מאוד את החיים. כשאני מגיע לשרת ואני צריך לחפש משהו, הדבר הראשון שאני עושה הוא לבדוק אם ack מותקן. כלי זה הוא תחליף מצוין עבור grep, כמו גם find ו-wc במידה מסוימת. למה לא grep? ל-Ack יש הגדרות יפות יותר מחוץ לקופסה, אפשרויות קריאות יותר לאדם, פרל regex ומערכת תצורה. אם אתה אוהב (חייב) לחפש דרך הטרמינל, אז אתה בהחלט צריך לנסות את זה.
תכונות בסיסיות
Ack הוא רקורסיבי כברירת מחדל, ולכתוב פחות אפשרויות זה תמיד רעיון טוב.
אנחנו יכולים להשתמש בדגל -wלומר לכלי השירות לחפש דוגמה של הדפוס שלנו מוקף בגבולות מילים (רווח לבן, לוכסנים וכו').
ack -w mysql
Ack תומך בחיפוש לפי סוג קובץ. לדוגמה, בואו נמצא את גרסת המודול בקבצי json.
ack --json '"version":s+"d+.d+.d+"'
ניתן לראות רשימה מלאה של סוגי קבצים נתמכים באמצעות:
ack --help-typesלעתים קרובות אתה צריך לספור כמה פעמים מופיע ביטוי בקובץ יומן, למשל, כדי להבין כמה נתונים עיבד הסקריפט.
![]()
אנו סופרים כמה פעמים התהליך מתרחש בקובץ test.log, ללא התחשבות במקרה (-i).
אנו יכולים לספור התרחשויות לא רק בקובץ ספציפי אחד, אלא בקבוצה. בואו נסיים את החיפוש הקודם של המילה mysql: נספור את מספר המופעים של מילים (-עם) בקבצי *.js(--js), למעט קבצים שלא נמצא בהם דבר (-h) ומסכם את התוצאה.
# выведем на экран все вхождения
ack --js -w mysql
# считаем общую сумму вхождений
ack --js -wch mysql
בנוסף, נוכל לקבל דוח מפורט על מספר ההתרחשויות בכל קובץ באמצעות (-l)
ack --js -w -cl mysql
אם אתה צריך הקשר נוסף לחיפוש שלך, אתה יכול לשאול את ack
הצג שורות עד (-B) ואחרי (-A) של הביטוי שנמצא. לשם כך, עליך לציין לאחר האפשרות את מספר השורות שיש להציג.
# 2 строки до
ack --js --column -B 2 "query.once('" ./lib/
# 2 строки после
ack --js --column -A 2 "query.once('" . /lib/
ואם אתה צריך את שניהם, אז השתמש (-ג)
ack --js --column -C 2 "query.once('" ./lib/יש גם אפשרות (-v) כדי להפוך את החיפוש, כלומר להציג קווים שאינם מכילים דפוס נתון.
הבעה רגילה
Ack, שלא כמו grep, משתמש בביטויים תואמי Perl.
עבורי זה יתרון גדול; אני לא צריך לזכור תחביר נפרד לביטויים רגולריים.
ack 'vars+adds+'
דוגמה מורכבת יותר
ack '*s+[vd+.d+.d+]'
לעתים קרובות אתה רוצה להשאיר בתוצאות רק את מה שמתאים לתבנית. אפשרות --פלט תעזור כאן (-o)
ack -o '*s+[vd+.d+.d+]'
בנוסף, באמצעות סוגריים נוכל לבחור את החלק שנמצא ולגשת אליו בפלט דרך המשתנה $[group number]. לדוגמה,
ack --output='version is $1' '*s+[v(d+.d+.d+)]'
לאק יש אפשרויות שימושיות --טווח-התחלה и ---range-end. הם עוזרים מתי
הנתונים מאוחסנים לא בשורה אחת, אלא בצורה מרובת שורות.
לדוגמה, יש קובץ עם קוד sql

בוא נחלץ את שמות העמודות. תחילת הבלוק תהיה שורה שמתחילה ב-SELECT, והסוף תהיה שורה שמתחילה ב-FROM.
ack --range-start ^SELECT --range-end ^FROM 'td+.' ./test.sql
אם ביטוי החיפוש מכיל תווים מיוחדים כמו נקודה, סוגריים ואחרים, אז כדי לא לחמוק מהם באמצעות , אתה יכול להשתמש באפשרות -Q.
# Поиск с экранированием
ack --json 'mysql.'
# Поиск без экранирования
ack --json -Q mysql.
עבודה עם קבצים
קבל רשימה של קבצים עם סיומת ספציפית
ack -f --js
מצא את כל קבצי js ששמם מתחיל ב-P* באמצעות האפשרות (-g).
ack -g --js '/Pa.+.js$'
תְצוּרָה
לכלי השירות יש קובץ תצורה משלו. אתה יכול לקבל גם תצורה גלובלית עבור המשתמש (~/.ackrc) וגם מקומית עבור תיקיה ספציפית (עליך ליצור קובץ .ackrc בתיקייה).
ניתן לציין ידנית את רוב האפשרויות שנכתבות בהגדרות בעת הקריאה. בואו נסתכל על כמה מהם.
התעלם מתיקייה בעת חיפוש
--ignore-dir=distבואו נוסיף סוג קובץ מותאם אישית -vue.
--type-add=vue:ext:js,vueכעת אתה יכול להשתמש באפשרות --vue כדי לחפש קבצים .vue. לדוגמה: אפליקציית ack --vue.
אתה יכול לציין רשימה של הרחבות עבור אפשרות זו. לדוגמה, כאן, בעת שימוש ב-vue, יעובדו הדברים הבאים: קבצי .js.
התעלם מקבצים, למשל ממוזער *.min.js
--ignore-file=match:/.min.js$/התקנה
CentOS
yum update -y && yum install ack -yאובונטו
apt-get update -y && apt-get install ack-grep -yOS Mac
brew update && brew install ackהתקנה מהאתר
curl https://beyondgrep.com/ack-v3.3.1 > ~/bin/ack && chmod 0755 ~/bin/ackתוספים לעורכים:
מסקנה
אלו לא כל האפשרויות. ניתן לראות את רשימת הפונקציות המלאה על ידי הפעלת:
ack –-help
# или
ack --manכלי השירות ack מאפשר לך להפוך את החיפוש בטרמינל לנוח וגמיש יותר. ושימוש בצינור (ack -C 10 שלום | עולם ack) ניתן ליצור קומבינה עוצמתית לחיפוש וסינון נתונים במערכת הקבצים ובקבצים עצמם.
מקור: www.habr.com
