【Cmd命令行】基礎—findstr與for循環


Findstr命令

findstr是Window系統自帶的命令,用途是查找指定的一個或多個文件文件中包含(或通過參數 /V來控制不包含)某些特定字符串的行,並將該行完整的信息打印出來,或者打印查詢字符串所在的文件名。

例如我們新建一個test.txt的文本文件。內容:

hello world
world hello

打開cmd窗口,執行語句:

findstr /n ".*" test.txt
打印:
1:hello world
2:world hello1

這里/n、.*、test.txt含義:

/n ——在匹配的每行前打印行數。即“1:”這兩個字符串。

.* ——在findstr中使用正則表達式,用於匹配部分或者更多的文件(.*代表匹配所有內容)。注意,正則表達式需要使用雙引號。

另外,在findstr中,接受的以下元字符用於實現更高級的匹配:

. 通配符 任何字符

* 重復: 以前字符或類別出現零或零以上次數

^ 行中的位置:行首

$ 行中的位置:行尾

[class] 字符類:集中的任何一個字符

[^class] 反向類:非集中的任何一個字符

[X-y] 范圍:指定范圍內的任何字符

\X 轉義:元字符 X 的文字用途

\ 字的位置:字首

xyz> 字的位置:字尾

例如,匹配以hello1字符串結尾的行信息:

findstr /n ".*hello1" test.txt
打印:
world hello1

test.txt —— 執行搜索的文件,同樣也可以利用通配符實現多種方式:

*.txt 搜索所有txt文檔

abc.* 搜索所有指定(abc)名稱的文件

*.* 搜索所有文件

for循環命令

基本用法:

格式:FOR [參數] %%變量名 IN (相關文件或命令) DO 執行的命令

  作用:對一個或一組文件,字符串或命令結果中的每一個對象執行特定命令,達到我們想要的結果。

  注意:在批處理文件中使用 FOR命令時,指定變量請使用%%variable,而不要用%variable。變量名稱是區分大小寫的,所以 %i 不同於 %I.

  關於:for命令可以帶參數或不帶參數,帶參數時支持以下參數:/d /l /r /f

實例

咱們用一個實例來熟悉下for循環的用法。將ports-desc.txt中的端口號取出來存入另一個文件ports.txt文件中,代碼:

ports-desc.txt內容如下:

1 傳輸控制協議端口服務多路開關選擇器 
2 compressnet 管理實用程序 
3 壓縮進程 
5 遠程作業登錄 
...

首先 新建一個bat文件test.bat(在cmd窗口直接輸入名稱運行),獲取文件每行的信息,用到一個循環:

@echo off
for /f "tokens=1* delims=:" %%i in ('findstr /n ".*" basic_port.txt') 
do (
    echo %%j
)
)
pause

打印:
1:1 傳輸控制協議端口服務多路開關選擇器 
2:2 compressnet 管理實用程序 
3:3 壓縮進程 
4:5 遠程作業登錄 
...

因為使用了/n參數,所以每行首有序列號及冒號。這里詳解下:

('findstr /n ".*" basic_port.txt') 會返回多行信息類似數組,for循環遍歷每行字符串

delims=: 代表將每行字符串利用=后的字符進行分割

tokens=1* 1表示取每行分割后的第一列(可以理解為數組第一個arr[0])並存入變量%%i,后面所有的元素存入$$j()

以第一行為例,%%i等於1;$$j等於“1 傳輸控制協議端口服務多路開關選擇器”

其次,遍歷每行字符串,因此需要用到第二個循環,並且嵌套在其中:

第二個循環命令中,需要使用第一個循環%%j(即每行字符串)的值,必須使用變量的方式。而一般變量表示為%變量%,這里比較特殊,需要用!變量!的方式。像這樣:

%%k in ("!string!") do(code...)

現在代碼為:

@echo off
for /f "tokens=1* delims=:" %%i in ('findstr /n ".*" basic_port.txt') 
do (
    set set string=%%j
    for /f "tokens=1* delims= " %%k in ("!string!") do (
     echo %%k
    )
)
pause

打印:
!string!
!string!
!string!
!string!
!string!
...

運行后,結果不對。度娘后發現嵌套循環的問題:變量延遲。需要在第一行加上“setlocal enabledelayedexpansion”

加上后:

@echo off&setlocal enabledelayedexpansion
for /f "tokens=1* delims=:" %%i in ('findstr /n "^[0-9]* " basic_port.txt') 
do (
    set string=%%j
    for /f "tokens=1* delims= " %%k in ("!string!") do (
         echo %%k
    )
)
pause

現在就可以把數據一條條存入目標文件ports.txt文件中:

最后代碼:

@echo off&setlocal enabledelayedexpansion
for /f "tokens=1* delims=:" %%i in ('findstr /n "^[0-9]* " basic_port.txt') 
do (
    set string=%%j
    for /f "tokens=1* delims= " %%k in ("!string!") do (
         %%k>>ports.txt
    )
)
pause

>> 表示將數據追加到文件中。首次會新建這個文件。

> 一個時表示直接覆蓋

總結


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM