חיפוש ממסמך הפקודות של Windows

הפקודה FIND

כדי לחפש טקסט במספר קבצים ממסמך הפקודות של Windows או קבצי באטץ', אפשר להשתמש בפקודה FIND, שהיתה קיימת כבר מימי MS DOS ועדיין זמינה ב-Windows 11. היא דומה לפקודת Unix grep, אך אינה תומכת בביטויים רגולריים. אם ברצונך לחפש את המילה borogoves בספרייה הנוכחית, עליך להשתמש בתחביר זה:

find "borogoves" *

שים לב שהכפתורים סביב התבנית חובה. אם אתה משתמש ב-PowerShell, עליך לכלול גם כפתורים:

find '"borogoves"' *

במקום הכוכבית (*), אפשר לציין מסך קבצים כמו *.htm?. הפקודה find מציגה את שמות הקבצים שהיא סורקת, אפילו אם היא לא מוצאת תוצאות בקבצים אלה:

החיפוש הוא רגיש לגופיים כברירת מחדל, ולכן בדרך כלל יש להוסיף את המפתח /I כדי להתייחס לאותיות גדולות וקטנות כשוות:

find /I "<a href=" *.htm

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

help | find /i "copy"

מפתח נוסף, /V, מאפשר לך למצוא את כל השורות שאינן מכילות את התבנית, דומה לפקודת grep -v.

בקבצי באטץ', אפשר להשתמש בעובדה שהפקודה find מגדירה את קוד הפריצה (errorlevel) ל-1 אם התבנית לא נמצאה. לדוגמה, אפשר לבדוק אם המכשיר פועל על גרסת Windows בינונית או קיוביטית:

@echo off 
rem Based on KB556009 with some corrections reg Query "HKLM\Hardware\Description\System\CentralProcessor\0" /v "Identifier" | find /i "x86 Family" > nul if errorlevel 1 goto win64 
echo 32-bit Windows goto :eof 
:win64 rem Could be AMD64 or ARM64 echo 64-bit Windows

הפקודה FINDSTR: חיפוש בביטויים רגולריים

אם אתה צריך לחפש אחת רגולרית, נסה את הפקודה FINDSTR, שהוצגה ב-Windows XP. לפי סיבות היסטוריות, findstr תומכת בתת-קבוצה מוגבלת של ביטויים רגולריים, כך שאפשר להשתמש רק באפקטים הביטויים הרגולריים הבאים:

  • הנקודה . מתאימה לכל תו מלבד שורה חדשה ותווים ASCII מורחבים.
  • רשימת תווים [abc] מתאימה לכל אחד מהתווים המסופקים (a, b, או c).
  • טווחי רשימת תווים [a-z] מתאימים לכל אות מ-a עד z.
  • הכוכבית (*) מציינת שהתו הקודם יכול להתרחש פעמים אפס או יותר.
  • הסמלים \< ו-\> מסמנים את תחילת ואת סוף המילה.
  • הכותרת (^) וסימן הדולר ($) מציינים את תחילת שורה וסוף שורה.
  • הסימן הכפול (\) מבודד כל סמל מפלגה, מה שמאפשר לך למצוא תווים מילוליים. לדוגמה, \$ מוצא את סימן הדולר עצמו.

findstr אינה תומכת בקבוצות תווים (\d), בחירה מרובה (|), או חזרות אחרות (+ או {5}).

התחביר הבסיסי הוא זהה לפקודת FIND:

findstr "\<20[0-9][0-9]\>" *.htm

פקודה זו מוצאת את כל השנים המתחילות ב-2000 בקבצי .htm של הספרייה הנוכחית. בדיוק כמו עם find, השתמש במנהלת /I עבור חיפוש בלתי תלוי בקיצור:

מגבלות ומוזרויות של FINDSTR

רשימות תווים [a-z] תמיד בלתי תלויות בקיצור, כך ש-echo ABC | findstr "[a-z]" מתאים.

התו הרווח פועל כתו מטאכריטר ההחלפה ב-findstr, כך ששאילתת חיפוש כמו findstr "new shoes" * תמצא את כל השורות המכילות או new או shoes. למרבה הצער, אין דרך לברוח את הרווח ולהשתמש בו כתו ממשי בביטוי רגולרי. לדוגמה, אין דרך למצוא שורות שמתחילות ברווח.

שגיאות תחביר בביטוי רגולרי מתעלמות. לדוגמה, findstr "[" * יתאים לכל השורות המכילות את התו [.

אם הקובץ מכיל סיומות שורה של Unix (LF), המטאכריטר $ אינו עובד נכון. אם השורה האחרונה של הקובץ חסרה סיומת שורה, findstr לא יוכל למצוא אותה. לדוגמה, findstr "</html>$" * לא יעבוד אם אין CR+LF אחרי </html>.

גרסאות מוקדמות של Windows היו מצויבות במגבלות על אורך השורה עבור find ו-findstr, כמו גם לפקודות אחרות. גרסאות מוקדמות של Windows הרחיקו את המגבלות אלה, כך שאין צורך לדאוג לגביהן יותר. ראה את השאלה ב-StackOverflow זו על מגבלות ובאגים של findstr, במיוחד בגרסאות מוקדמות של Windows.

הפקודה findstr פועלת בדף הוראות OEM (MS DOS); משתנה הנקודה אינו מתאים לאף אחד מהתווים המורחבים של ASCII. כתוצאה מכך, הפקודה אינה מאוד שימושית עבור טקסט שאינו אנגלי. חוץ מזה, אין אפשרות לחפש תווים יוניקודה (UTF-8 או UTF-16).

מסקנה

אפשר ללמוד על שינויים אחרים על ידי הקלדת findstr /? או find /?. לדוגמה, השינויים הנוספים מאפשרים לך לחפש בתת-קבצים או להדפיס מספרי שורות. כמו כן, אפשר להתייעץ בהתיעוד הרשמי.

באופן כללי, הפקודות find ו-findstr מיושנות ומגיעות עם מספר פגמים ומגבלות שונים.

Source:
https://dzone.com/articles/search-from-the-windows-command-prompt