เคยได้ยิน FINDSTR และ Select-String ไหม? Select-String เป็น cmdlet ที่ใช้ค้นหาข้อความและรูปแบบในสตริงและไฟล์อินพุต คล้ายกับ grep บน Linux และ FINDSTR บน Windows ในคู่มือนี้ เราจะดูว่า FINDSTR และ Select-String คืออะไร และใช้อย่างไรใน Windows 11/10

FINDSTR คืออะไร และวิธีใช้งาน
FINDSTR เป็นคำสั่งที่ใช้ค้นหาข้อความเฉพาะในไฟล์บน Windows ย่อมาจาก Find String ยังใช้ค้นหาไฟล์ที่มีข้อความเฉพาะด้วย มีคำสั่ง FINDSTR หลายแบบสำหรับฟังก์ชันต่างๆ เปิดตัวครั้งแรกกับ Windows 2000 Resource Kit ชื่อ qgrep เป็นเครื่องมือในตัวของ Windows ไฟล์อยู่ในรูปแบบ .exe FINDSTR ไม่ค้นหา null bytes เช่น ช่องว่างในรูปแบบ Unicode
มีกฎพื้นฐานในการใช้คำสั่ง findstr บน Command Prompt หรือ CLI อื่นๆ ที่ Microsoft พัฒนา ดังนี้:
- คำสั่ง FINDSTR ต้องประกอบด้วยสตริงตามด้วยชื่อไฟล์
- สามารถใช้ literal characters และ meta-characters ได้ Literal characters ไม่มีความหมายพิเศษ ตัวอักษรและตัวเลขเป็น literal characters Meta-characters เป็นสัญลักษณ์ที่มีความหมายเฉพาะ ดังนี้:
| Meta-character | ค่า/ความหมาย |
|---|---|
| . | Wildcard – ตัวอักษรใดๆ |
| * | Repeat – ศูนย์หรือมากกว่าการเกิดของตัวอักษร/คลาสก่อนหน้า |
| ^ | Beginning line position – ต้นบรรทัด |
| $ | Ending line position – ท้ายบรรทัด |
| [class] | Character class – ตัวอักษรใดตัวหนึ่งในชุด |
| [^class] | Inverse class – ตัวอักษรใดตัวหนึ่งที่ไม่อยู่ในชุด |
| [x-y] | Range – ตัวอักษรในช่วงที่ระบุ |
| \x | Escape – ใช้ meta-character ตรงตัว |
| \<string | Beginning word position – ต้นคำ |
| string\> | Ending word position – ท้ายคำ |
- ควรสร้างไฟล์ข้อความที่มีเกณฑ์การค้นหาแต่ละบรรทัด แยกบรรทัด เมื่อต้องการค้นหาสตริงหลายตัว
- ใช้เว้นวรรคระหว่างสตริงเพื่อค้นหาสตริงหลายตัวในคำสั่งเดียว เว้นแต่ syntax ที่ใช้
/c
พารามิเตอร์และความหมายใน syntax findstr
| Parameter | คำอธิบาย |
|---|---|
| /b | จับคู่รูปแบบข้อความถ้าอยู่ต้นบรรทัด |
| /e | จับคู่รูปแบบข้อความถ้าอยู่ท้ายบรรทัด |
| /l | ประมวลผลสตริงค้นหาแบบตรงตัว |
| /r | ประมวลผลสตริงค้นหาเป็น regular expressions (ค่าเริ่มต้น) |
| /s | ค้นหาในไดเรกทอรีปัจจุบันและซับไดเรกทอรีทั้งหมด |
| /i | ไม่สนใจตัวพิมพ์เล็ก/ใหญ่ในการค้นหา |
| /x | แสดงเฉพาะบรรทัดที่ตรงกันทุกตัว |
| /v | แสดงเฉพาะบรรทัดที่ไม่มีการจับคู่ |
| /n | แสดงหมายเลขบรรทัดของแต่ละบรรทัดที่จับคู่ |
| /m | แสดงเฉพาะชื่อไฟล์ถ้าไฟล์มีการจับคู่ |
| /o | แสดงตำแหน่งอักขระก่อนแต่ละบรรทัดที่จับคู่ |
| /p | ข้ามไฟล์ที่มีอักขระที่พิมพ์ไม่ได้ |
| /off[line] | ไม่ข้ามไฟล์ที่มีแอตทริบิวต์ offline |
| /f:<file> | รับรายการไฟล์จากไฟล์ที่ระบุ |
| /c:<string> | ใช้ข้อความที่ระบุเป็น literal search string |
| /g:<file> | รับสตริงค้นหาจากไฟล์ที่ระบุ |
| /d:<dirlist> | ค้นหาในรายการไดเรกทอรีที่ระบุ (คั่นด้วย ;) |
| /a:<colorattribute> | ระบุแอตทริบิวต์สีด้วยเลขฐานสิบหก 2 หลัก พิมพ์ color /? เพื่อดูเพิ่มเติม |
| <string> | ระบุข้อความที่ต้องการค้นหาใน filename (จำเป็น) |
| <span “>[\<drive>:][<path>]<filename>[…] | ระบุตำแหน่งและไฟล์ที่จะค้นหา ต้องมีชื่อไฟล์อย่างน้อย 1 ไฟล์ |
| /? | แสดง Help ที่ command prompt |
ตัวอย่างการใช้คำสั่ง findstr
1] ค้นหาคำว่า microsoft หรือ windows ในไฟล์ x.y:
findstr microsoft windows x.y
2] ค้นหาคำว่า "microsoft windows" ในไฟล์ x.y:
findstr /c:"microsoft windows" x.y
ในคำสั่งข้างต้น /c ใช้เพื่อค้นหาข้อความ "microsoft windows" ในไฟล์
3] หาคำว่า Microsoft (ตัว M ใหญ่) ในไฟล์ twc.txt:
findstr Microsoft twc.txt
4] ค้นหาคำว่า Microsoft ในไดเรกทอรีและซับไดเรกทอรี ไม่สนใจตัวพิมพ์:
findstr /s /i Microsoft *.*
/s ค้นหาไดเรกทอรีปัจจุบันและซับไดเรกทอรี /i ไม่สนใจตัวพิมพ์เล็ก/ใหญ่
5] หาบรรทัดที่เริ่มต้นด้วย To (อาจมีช่องว่างหลายช่อง) และแสดงหมายเลขบรรทัด:
findstr /b /n /r /c:^ *To *.bas
6] ค้นหาสตริงหลายตัวในหลายไฟล์ โดยเกณฑ์ใน stringlist.txt และรายการไฟล์ใน filelist.txt บันทึกผลใน results.out:
findstr /g:stringlist.txt /f:filelist.txt > results.out
7] หาไฟล์ที่มีคำว่า thewindowsclub ในไดเรกทอรีและซับไดเรกทอรี:
findstr /s /i /m \<thewindowsclub\> *.*
8] หาไฟล์ที่มี thewindowsclub และคำอื่นๆ ที่ขึ้นต้นด้วย the เช่น thesis, thermometer:
findstr /s /i /m \<the.* *.*
นี่คือวิธีใช้คำสั่ง findstr ใน CLI ต่างๆ ต้องเข้าใจพารามิเตอร์และ meta-characters ทุกตัวเพื่อเขียน syntax และใช้งานได้อย่างมีประสิทธิภาพ
Select-String คืออะไร และพารามิเตอร์ต่างๆ
จินตนาการว่าคุณเขียนโค้ด PowerShell ยาวๆ แล้วลืมตำแหน่งสตริง/ข้อความบางส่วนในไฟล์หลายพันบรรทัด Select-String ช่วยค้นหาสตริงและข้อความในไฟล์อินพุต PowerShell ได้ คล้าย grep บน Linux
Select-String เป็น cmdlet ที่ค้นหาข้อความและรูปแบบในสตริงและไฟล์อินพุต เมื่อใช้ค้นหา จะหาคู่แรกในแต่ละบรรทัด และแสดงชื่อไฟล์ หมายเลขบรรทัด และบรรทัดทั้งหมดที่จับคู่ สามารถใช้หาหลายคู่ต่อบรรทัด แสดงข้อความก่อน/หลังคู่ที่เจอ หรือได้ผลลัพธ์เป็น Boolean (True/False) ยังสามารถแสดงข้อความทั้งหมดยกเว้นคู่ที่จับคู่ได้ Wildcards ของ FINDSTR ใช้ใน Select-String ได้เช่นกัน รองรับ encoding ต่างๆ เช่น ASCII, Unicode ใช้ Byte-Order-Mark (BOM) กำหนด encoding ถ้าไม่มี BOM จะถือว่าเป็น UTF8
พารามิเตอร์ของ Select-String
Microsoft พัฒนาพารามิเตอร์ดังต่อไปนี้:
-AllMatches– ค้นหาทุกคู่ในบรรทัด (ปกติหาแค่คู่แรก)-CaseSensitive– จับคู่แบบสนใจตัวพิมพ์เล็ก/ใหญ่ (ค่าเริ่มต้นไม่สนใจ)-Context– จับบรรทัดก่อนและหลังคู่ที่เจอตามจำนวนที่ระบุ (เช่น 1 = 1 บรรทัดก่อนและหลัง)-Culture– ระบุ culture ใน syntax (เช่น ordinal, invariant)-Encoding– ระบุ encoding ของข้อความในไฟล์ (ASCII, UTF8, UTF7, Unicode ฯลฯ)-Exclude– ยกเว้นข้อความบางส่วนในไฟล์-Include– รวมข้อความบางส่วนในไฟล์-InputObject– ระบุข้อความที่จะค้นหา-List– ดึงรายการไฟล์ที่จับคู่กับข้อความ-LiteralPath– ระบุพาธสำหรับการค้นหา-NoEmphasis– ไม่เน้นสีคู่ที่เจอ (ปกติจะเน้น)-NotMatch– หาข้อความที่ไม่จับคู่กับรูปแบบที่ระบุ-Path– ระบุพาธที่จะค้นหา พร้อมใช้ wildcard ได้-Pattern– หาคู่ในแต่ละบรรทัดเป็นรูปแบบ-Quiet– ได้ผลลัพธ์เป็น Boolean (True/False)-Raw– แสดงเฉพาะ matching objects ไม่ใช่ Match info-SimpleMatch– จับคู่แบบง่าย ไม่ใช่ regular expression
ความแตกต่างระหว่าง FINDSTR และ Select-String
FINDSTR เป็น executable ไฟล์ยุคก่อน PowerShell ใช้ค้นหาข้อความ/สตริงในไฟล์ Select-String เป็น PowerShell cmdlet ใช้ค้นหาข้อความและรูปแบบในไฟล์ เปรียบเทียบกับ FINDSTR แล้ว Select-String เป็น cmdlet ที่ทรงพลังและซับซ้อนกว่า แสดงข้อมูลรายละเอียดมากกว่ามาก
What is the PowerShell equivalent of grep?
Select-String คือ PowerShell equivalent ของ grep บน Windows ทำงานคล้าย grep และให้ข้อมูลรายละเอียดตามพารามิเตอร์ที่ใช้
Does FINDSTR work on Word files?
ใช่ FINDSTR ทำงานกับไฟล์ Word ได้ แต่ไม่สามารถหาคู่ได้แม้สตริงจะอยู่ในไฟล์ สามารถให้ผลลัพธ์ในไฟล์ binary .doc แต่ไม่ใช่ .docx ไม่ทราบสาเหตุทางเทคนิค
Related Read: How to check the PowerShell version in Windows.
