從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指令若未找到模式則設置退出代碼(錯誤層級)為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]可匹配指定字符(abc)中的任一個。
  • 字符列表範圍[a-z]可匹配從az的任何字母。
  • 星號(*)表示前一字符可重複零次或多次。
  • 符號\<\>標記一個單詞的起始與結尾。
  • 插入符號(^)與美元符號($)表示一行的開始與結束。
  • 反斜線(\)可跳脫任何元字符,讓您能找到字面上的字符。例如,\$可找到美元符號本身。

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" *這樣的搜尋查詢會找到包含newshoes的所有行。不幸的是,無法逃避空格並將其用作正則表達式中的文字字符。例如,無法找到以空格開頭的行。

正則表達式中的語法錯誤會被忽略。例如,findstr "[" *將匹配包含[字符的所有行。

如果文件包含Unix換行符(LF),則$元字符無法正確工作。如果文件的最後一行缺少行終止符,findstr將無法找到它。例如,findstr "</html>$" *在</html>後沒有CR+LF的情況下將無法工作。

早期的Windows版本對於findfindstr等命令的行長度有限制。但近期版本已解除這些限制,因此無需再擔心。有關findstr的限制與錯誤,尤其是早期Windows版本的情況,可參考此StackOverflow問題

findstr命令運行於OEM(MS DOS)代碼頁,其點元字符不匹配任何擴展ASCII字符,導致對非英文文本的實用性不高。此外,無法搜索Unicode字符(UTF-8或UTF-16)。

結論


可透過輸入findstr /?find /?了解其他開關,例如允許搜索子目錄或列印行號。亦可查閱官方文件

總體而言,findfindstr命令已過時,並伴隨著多種怪癖與限制。

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