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
>> 表示將數據追加到文件中。首次會新建這個文件。
> 一個時表示直接覆蓋
參考