一、什麼是管道命令管道命令能夠將乙個命令的執行結果經過篩選,只保留我們需要的資訊。
如 dir 命令會顯示目錄下所有資料夾和檔案,可以使用管道命令| findstr "" 將dir的結果進行篩選,只保留需要的資訊
二、管道命令的使用
1、windows netstat 檢視埠、程序占用
//2、檢視資料夾目錄結構假如我們需要確定誰占用了我們的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,064k//
很清楚吧,tor.exe 占用了你的埠
tree >list.txt3、輸入輸出重定向tree /f >list.txt
echo -c //輸入輸出重定向:-c:不換行,linux下則是-n
每執行乙個命名,都會有3個與之相關的檔案.標準輸入檔案,標準輸出檔案,錯誤輸出檔案.
因為unix/linux下把任何乙個裝置都當作檔案看待,所有實際上標準輸入檔案是鍵盤,
標準輸出和錯誤輸出檔案是螢幕.
> 輸出重定向
<
>> 輸入追加
檔案描述符:
每乙個檔案可以用檔案描述符來描述,系統提供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理解:cmd使用預設的標準輸入,執行,碰到end,則追加,但是標準輸入輸出
不能追加,於是出錯退出.
注:經試驗理解不對,據linux shell程式設計25章的說法,
這是shell定的語法.可以直接理解成end為分隔符.
cmdcmd>&m //把檔案描述符m作為cmd的輸出
cmd!!!注意:
1. 輸入輸出定向符前面不要加空格,否則容易出意想不到的問題
2. 0 1 2不能使用》或《定向符,例: 2>>&1 出錯
4、for迴圈命令
格式:for [引數] %%變數名 in (相關檔案或命令) do 執行的命令例項咱們用乙個例項來熟悉下for迴圈的用法。將ports-desc.txt中的埠號取出來存入另乙個檔案ports.txt檔案中,**://作用:對乙個或一組檔案,字串或命令結果中的每乙個物件執行特定命令,達到我們想要的結果。
//注意:在批處理檔案中使用 for命令時,指定變數請使用%%variable,而不要用%variable。變數名稱是區分大小寫的,所以 %i 不同於 %i.
//關於:for命令可以帶引數或不帶引數,帶引數時支援以下引數:/d /l /r /f
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
>> 表示將資料追加到檔案中。首次會新建這個檔案。
> 乙個時表示直接覆蓋
參考cmd下過濾檔名稱的兩種方法
cmd管道命令使用
Linux Unix 命令列 管道與過濾
在unix系統中,管道是一種先進先出的單向資料通路.利用管道符號 可以把乙個命令的標準輸出連線到另乙個命令的標準輸入.例如,利用管道把ls和wc兩個命令連線到一起,可以得到指定目錄下的檔案數量.ls usr wc w 重上述命令的執行效果看,可以把組合命令分解為以下兩個命令 ls usr fname...
使用subprocess執行命令列,管道阻塞
python中使用subprocess執行一系列cmd命令時,偶爾會出現阻塞情況,命令沒有繼續執行完畢。原因 subprocess的pipe是有大小的。在python2.6.11之前,pipe的大小為檔案頁的大小 i386上是4096 2.6.11之後變為65536.因此當輸出內容超過65536,會...
git 命令列 和 cmd命令列
設定全域性使用者名稱 git config global user.name 區域性把global換成local 檢視全域性 git config global list 檢視git的狀態 git status 初始化 git into 名字 新增乙個檔案 git add readme.txt 刪除...