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循环的更多相关文章

  1. Node.js(window)基础(1)——用cmd命令行访问某一文件夹下的js文件

    一.安装,从官网上下载安装,安装基本一直点击下一步就行.注意:node.js基于Python的,安装node.js之前电脑上要安装Python,最好是Python2.7或2.6. 二.cmd进入命令行 ...

  2. 在windows下使用cmd命令行对java文件进行编译和执行

    windows下利用cmd命令行可以调用jdk里的javac.exe和java.exe对java文件进行编译和执行,前提是jdk已成功安装并正确配置相关环境变量 相关配置链接:java基础学习总结—— ...

  3. Atitit.执行cmd 命令行 php

    Atitit.执行cmd 命令行 php 1. 执行cmd 命令行,调用系统命令的基础 1 1.1. 实际执行模式 1 1.2. 空格的问题 1 1.3. 中文路径的问题,程序文件读取编码设置 1 1 ...

  4. windows脚本(VBS)之cmd命令行的妙用

    windows脚本(VBS)之cmd命令行的妙用 (2009-08-06 13:40:55) 转载▼ 标签: 脚本 cmd 命令行 vbs js 简单 公式 windows it 分类: 计算机 脚本 ...

  5. Atitit.运行cmd 命令行 php

    Atitit.运行cmd 命令行 php 1. 运行cmd 命令行,调用系统命令的基础 1 1.1. 实际运行模式 1 1.2. 空格的问题 1 1.3. 中文路径的问题.程序文件读取编码设置 1 1 ...

  6. Linux中级之windows下使用curl命令(cmd命令行)

    在官网下载工具包:http://curl.haxx.se/download.html(根据自己电脑系统位数选择) 使用方式一:在curl.exe目录中使用 解压下载后的压缩文件,通过cmd命令进入到c ...

  7. 在cmd命令行使用Maven Archetype插件 generate命令创建简单的java web项目

    前提: 1.下载apache-maven:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache ...

  8. Mongodb的备份,恢复,导入与导出(cmd命令行实现)

    要用MongoDB,自然就要用到数据导入导出,就自己学习了一下. 在Mongo学习(二)中就讲到了在bin目录下有一些工具,本篇就是使用这些工具进行数据的导入导出及备份恢复. 注意:以下命令均在cmd ...

  9. 【转】PowerShell入门(二):PowerShell是Cmd命令行的加强版吗?

    转至:http://www.cnblogs.com/ceachy/archive/2013/01/31/PowerShell_vs_Cmd.html PowerShell是命令行的加强版吗?Power ...

  10. 在windows中,如何使用cmd命令行窗口正确显示编码为utf-8格式的文字

    在windows中,如何使用cmd命令行窗口正确显示编码为utf-8格式的文字呢? 正确的步骤如下: 1, 打开cmd命令行窗口 2, 输入命令 >chcp 65001 数字65001代表的是c ...

随机推荐

  1. Java接口和抽象类理解(New)

    一. 抽象类和接口的特点  包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法.注意,抽象类和普通类的主要有三点区别: 1)抽象方法必 ...

  2. 微信小程序,动态改变样式

    小程序目前没有修改样式api,但是可以利用数据绑定实现动态改变样式,可以用view标签模拟page然后改变view标签的样式,以下案例演示了如果改变page背景颜色: <view class=& ...

  3. easyui扩展行默认展开 以及 去除滚动条

     问题背景: 在做打印页面的时候,要求有详细的默认展开显示.    遇到的问题: 1)在用扩展行的时候,grid的所有行都添加了展开收起的图标,(第二行没有明细)如下  2)默认展示有详细行的时候,内 ...

  4. Spring @Value SpEl 知识点小记

    在JavaBean文件中使用Spring的@Value注解获取配置文件.yml或资源文件.properties中 key - value 键值信息 @Value("${stu.number} ...

  5. gradle中文学习资料

    http://wiki.jikexueyuan.com/project/GradleUserGuide-Wiki/ https://www.gitbook.com/book/lippiouyang/g ...

  6. JDBC URL格式定制

    数据库URL制定: 当加载的驱动程序,可以建立程序中使用DriverManager.getConnection()方法的连接.为方便参考,让列出了三个重载DriverManager.getConnec ...

  7. javascript tips and snippets

    如何给javascript对象动态创建动态key // ES2015 var key = 'DYNAMIC_KEY', obj = { [key]: 'ES6!' }; console.log(obj ...

  8. 爬虫入门之Scrapy框架基础rule与LinkExtractors(十一)

    1 parse()方法的工作机制: 1. 因为使用的yield,而不是return.parse函数将会被当做一个生成器使用.scrapy会逐一获取parse方法中生成的结果,并判断该结果是一个什么样的 ...

  9. Windows 如何查看本地端口被进程占用的情况?

    1.查看端口占用情况: 1.开始--运行--cmd 进入命令提示符. 2. 输入netstat -ano(或netstat -nao) ,即可看到所有进程(这里显示进程的PID)占用端口的情况. 3. ...

  10. ACM HDU 1755 -- A Number Puzzle

    A Number Puzzle Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...