1、什么是管道命令
管道命令可以将一个命令的执行结果通过筛选,只保留咱们须要的信息。
如 dir 命令会显示目录下全部文件夹和文件,可使用管道命令| findstr "" 将dir的结果进行筛选,只保留须要的信息
2、管道命令的使用html
一、Windows netstat 查看端口、进程占用linux
// 假如咱们须要肯定谁占用了咱们的9050端口 C:/>netstat -aon|findstr "9050" TCP 127.0.0.1:9050 0.0.0.0:0 LISTENING 2016 // 看到了吗,端口被进程号为2016的进程占用,继续执行下面命令: C:/>tasklist|findstr "2016" tor.exe 2016 Console 0 16,064 K // 很清楚吧,tor.exe 占用了你的端口
二、查看文件夹目录结构shell
tree > list.txt
tree /f >list.txt
三、输入输出重定向
编程
echo -c // -c:不换行,linux下则是-n
输入输出重定向:数组
每执行一个命名,都会有3个与之相关的文件.标准输入文件,标准输出文件,错误输出文件.post
由于unix/linux下把任何一个设备都看成文件看待,全部实际上标准输入文件是键盘,url
标准输出和错误输出文件是屏幕.spa
> 输出重定向.net
< 输入重定向unix
<< 输入追加
>> 输入追加
文件描述符:
每个文件能够用文件描述符来描述,系统提供12个,3-9能够任意定义.0-2系统定义以下:
0 标准输入 键盘
1 标准输出 显示器
2 错误输出 显示器
便可以用0-2表明上面的3个文件.
例如:cmd>file //cmd的输出重定向到file文件
cmd>>file //cmd的输出追加到file中,无则建立
cmd 1>file //把运行cmd的shell的标准输出重定向到file中,1表明标准输出
cmd>file 2>&1 //把cmd的输出重定向到file,同时把2(错误输出)重定向到1(标准输出).
2 > 1 则会把1当成文件,全部把错误定向到1必须使用&1.
cmd 2>file //把错误输出定向到file中
cmd>>file 2>&1 //把错误和cmd输出追加到file中,cmd>>file,追加;2>&1,错误定向到
标准输出,标准输入又追加到file中,因此错误和cmd输出都追加到file
cmd 1>>file 2>&1 //能够把此命令等效于上一个命令
cmdfile2 //cmd的输入是file1,结果输出到file2
cmd<<END //cmd使用标准输入,直到遇到END则退出.END可为任意一个字符
理解:cmd使用默认的标准输入,运行,碰到END,则追加,可是标准输入输出
不能追加,因而出错退出.
注:经试验理解不对,据linux shell编程25章的说法,
这是shell定的语法.能够直接理解成END为分隔符.
cmd<&m //把文件描述符m做为cmd的输入
cmd>&m //把文件描述符m做为cmd的输出
cmd<&- //关闭标准输入.
!!!注意:
1. 输入输出定向符前面不要加空格,不然容易出意想不到的问题
2. 0 1 2不能使用>>或<<定向符,例: 2>>&1 出错
四、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 offfor /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 offfor /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 enabledelayedexpansionfor /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 enabledelayedexpansionfor /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
>> 表示将数据追加到文件中。首次会新建这个文件。
> 一个时表示直接覆盖
参考