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
指令若未找到模式則設置退出代碼(錯誤層級)為1的特性。例如,可檢查機器運行的是64位元還是32位元的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
此命令會找出當前目錄中.htm
文件內所有以2000開頭的年份。如同find
命令,使用/I
開關進行不區分大小寫的搜尋:
FINDSTR的限制與特點
字符列表[a-z]
總是不區分大小寫,因此echo ABC | findstr "[a-z]"
會匹配。
空格字符在findstr
中作為交替元字符,所以像findstr "new shoes" *
這樣的搜尋查詢會找到包含new
或shoes
的所有行。不幸的是,無法逃避空格並將其用作正則表達式中的文字字符。例如,無法找到以空格開頭的行。
正則表達式中的語法錯誤會被忽略。例如,findstr "[" *
將匹配包含[
字符的所有行。
如果文件包含Unix換行符(LF),則$
元字符無法正確工作。如果文件的最後一行缺少行終止符,findstr
將無法找到它。例如,findstr "</html>$" *
在</html>後沒有CR+LF的情況下將無法工作。
早期的Windows版本對於find
和findstr
等命令的行長度有限制。但近期版本已解除這些限制,因此無需再擔心。有關findstr
的限制與錯誤,尤其是早期Windows版本的情況,可參考此StackOverflow問題
。
findstr命令運行於OEM(MS DOS)代碼頁,其點元字符不匹配任何擴展ASCII字符,導致對非英文文本的實用性不高。此外,無法搜索Unicode字符(UTF-8或UTF-16)。
結論
:
可透過輸入findstr /?
或find /?
了解其他開關,例如允許搜索子目錄或列印行號。亦可查閱官方文件
。
總體而言,find
和findstr
命令已過時,並伴隨著多種怪癖與限制。
Source:
https://dzone.com/articles/search-from-the-windows-command-prompt