【Cmd命令行】基礎—findstr與for迴圈

来源:http://www.cnblogs.com/wanxiong/archive/2016/06/27/cmd_intro_findstr.html
-Advertisement-
Play Games

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 迴圈的簡單用法,如有錯誤希望及時反饋糾正。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在 CentOS7 上安裝 MongoDB 1 通過 SecureCRT 連接至 CentOS7 伺服器; 2 進入到 /usr/local/ 目錄: cd /usr/local 3 在當前目錄下創建 tools 目錄: mkdir -p tools 4 進入到 tools 目錄中: cd tool ...
  • 在 CentOS7 上安裝 MySQL5.7 1 通過 SecureCRT 連接到阿裡雲 CentOS7 伺服器; 2 進入到目錄 /usr/local/ 中: cd /usr/local/ 3 創建目錄 /usr/local/tools,如果有則忽略: mkdir -p tools 4 創建 /u ...
  • 存儲過程(stored procedure)有時候稱為sproc,它是真正的腳本-或者更準確的說,他是批處理(batch)-它存儲於資料庫中,而不是淡出的文件中。無論如何,這個比較並不是很確定。存儲過程有輸出參數,輸入參數已及返回值等。而腳本不會有這些內容。 存儲過程基本語法:CREATE PROC ...
  • 語法:select * from 表名 where (欄位名) in (select 欄位,名 from 表名 group by 欄位名 having count(*) > 1); 如一下goods表: : 執行sql語句:select * from goods where inventory in ...
  • # 創建學生表 create table student(age int,name varchar(32))engine myisam charset utf8;insert into student values(18,'小白'); # 創建教師表,結構與學生表結構一模一樣create table ...
  • 現在項目上用redis的話,很少說不用集群的情況,畢竟如果生產上只有一臺redis會有極大的風險,比如機器掛掉,或者記憶體爆掉,就比如我們生產環境 曾今也遭遇到這種情況,導致redis記憶體不夠掛掉的情況,當然這些都是我們及其不能容忍的,第一個必須要做到高可靠,其次才是高性能,好了,下麵我來 逐一搭建一 ...
  • 一個項目的運行,總伴隨著性能問題,系統查詢過慢,如何快速查詢等 下麵將簡單講解一下,如何去排查及解決這些問題。 開發過程中: 1:不要絕對的三範式,適當建立冗餘能夠提高查詢速度,不用多表關聯 2:能用表關聯就不要出現迴圈SQL 例子:下麵的這種情況,每查出T_t1的一條數據,就會迴圈查找T_t2中的 ...
  • 本地模型運行 1:在windows的eclipse裡面直接運行main方法,就會將job提交給本地執行器localjobrunner執行 輸入輸出數據可以放在本地路徑下(c:/wc/srcdata/) 輸入輸出數據也可以放在hdfs中(hdfs://weekend110:9000/wc/srcdat ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...