Findstr命令 findstr是Window系統自帶的命令,用途是查找指定的一個或多個文件文件中包含(或通過參數 /V來控制不包含)某些特定字元串的行,並將該行完整的信息列印出來,或者列印查詢字元串所在的文件名。 例如我們新建一個test.txt的文本文件。內容: 打開cmd視窗,執行語句: 這 ...
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
>> 表示將數據追加到文件中。首次會新建這個文件。
> 一個時表示直接覆蓋
總結
本文簡單介紹了cmd下findStr與for 迴圈的簡單用法,如有錯誤希望及時反饋糾正。