Linux Bash Shell管線命令
就如同前面所說(shuō)的, bash 命令執(zhí)行的時(shí)候有輸出的資料會(huì)出現(xiàn)!那么如果這群資料必需要經(jīng)過(guò)幾道手續(xù)之后才能得到我們所想要的格式,應(yīng)該如何來(lái)設(shè)定?這就牽涉到管線命令的問(wèn)題了( pipe ),管線命令使用的是『 | 』這個(gè)界定符號(hào)!另外,管線命令與『連續(xù)下達(dá)命令』是不一樣的呦!這點(diǎn)底下我們會(huì)再說(shuō)明。底下我們先舉一個(gè)例子來(lái)說(shuō)明一下簡(jiǎn)單的Linux Bash Shell管線命令。
假設(shè)我們要讀取 last 這個(gè)指令中,那個(gè) root 登入的『次數(shù)』應(yīng)該怎么作?注意呦!我們只需要『次數(shù)』。那么我所進(jìn)行的步驟是:
1. 執(zhí)行 last ,將所有這個(gè)月的所有人登入資料取出來(lái);
2. 使用 grep 將上面的輸出資料(stdout)當(dāng)中的 root 擷取出來(lái),其他的不要;
3. 使用 wc 這個(gè)可以計(jì)算行數(shù)的指令將上一步的資料計(jì)算行數(shù)!
由于 last 的輸出是一行代表一次登入,所以只要計(jì)算幾行就代表登入幾次的意思,所以啰!經(jīng)由上面三個(gè)步驟,將 last 資料逐步的篩選,就可以得到我們的資料了!整個(gè)命令可以寫成如下:
[test @test bin]# last [test @test bin]# last | grep root [test @test bin]# last | grep root | wc -l
你可以分別執(zhí)行『 last 』然后再逐步增加為『 last | grep root 』,***到上面那一行,那么就馬上可以清楚的知道為何會(huì)這么做啰!
底下我們來(lái)談一談一些基本的Linux Bash Shell管線命令指令介紹:
· cut
語(yǔ)法:
[root @test /root ]# cut -d "分隔字元" [-cf] fields 參數(shù)說(shuō)明: -d :后面接的是用來(lái)分隔的字元,預(yù)設(shè)是『空白字元』 -c?。汉竺娼拥氖恰旱趲讉€(gè)字元』 -f?。汉竺娼拥氖堑趲讉€(gè)區(qū)塊? 范例: [root @test /root]# cat /etc/passwd | cut -d ":" -f 1 <==將 passwd 這個(gè)檔案里面,每一行里頭的 : 用來(lái)作為分隔號(hào), 而列出***個(gè)區(qū)塊!也就是姓名所在啦! [root @test /root]# last | cut -d " " -f1 <==以空白字元為分隔,并列出***個(gè)區(qū)間! [root @test /root]# last | cut -c1-20<==將 last 之后的資料,每一行的 1-20 個(gè)字元取出來(lái)!
· 說(shuō)明:
這個(gè) cut 實(shí)在很好用!不過(guò),說(shuō)真的,除非你常常在分析 log 檔案,否則使用到 cut 的機(jī)會(huì)并不多!好了! cut 主要的用途在于將『同一行里面的資料進(jìn)行分解!』,最常使用在分析一些數(shù)據(jù)或文字資料的時(shí)候!這是因?yàn)橛袝r(shí)候我們會(huì)以某些字元當(dāng)作分割的參數(shù),然后來(lái)將資料加以切割,以取得我們所需要的資料。我也很常使用這個(gè)功能呢!尤其是在分析 log 檔案的時(shí)候,跟 awk 也是很常用的!
· sort
語(yǔ)法:
[root @test /root ]# sort [-t 分隔符號(hào)] [(+起始)(-結(jié)束)] [-nru] 參數(shù)說(shuō)明: -t 分隔符號(hào):使用分隔符號(hào)來(lái)隔開(kāi)不同區(qū)間,預(yù)設(shè)是 tab +start -end:由第 start 區(qū)間排序到 end 區(qū)間 -n:使用『純數(shù)字』排序(否則就會(huì)以文字型態(tài)來(lái)排序) -r :反向排序 -u :相同出現(xiàn)的一行,只列出一次! 范例: [root @test /root]# cat /etc/passwd | sort <==將列出來(lái)的個(gè)人帳號(hào)排序! [root @test /root]# cat /etc/passwd | sort -t: +2n <==將個(gè)人帳號(hào)中,以使用者 ID 來(lái)排序(以 : 來(lái)分隔,第三個(gè)為 ID ,但***個(gè)代號(hào)為 0 之故) [root @test /root]# cat /etc/passwd | sort -t: +2nr <==反相排序啰!
· 說(shuō)明:
sort 同樣是很常用的指令呢!因?yàn)槲覀兂3P枰容^一些資訊啦!舉個(gè)上面的第二個(gè)例子來(lái)說(shuō)好了!今天假設(shè)你有很多的帳號(hào),而且你想要知道***的使用者 ID 目前到哪一號(hào)了!呵呵!使用 sort 一下子就可以知道答案咯!當(dāng)然其使用還不止此啦!有空的話不妨玩一玩!
· wc
語(yǔ)法:
[root @test /root ]# wc [-lmw] 參數(shù)說(shuō)明: -l :多少行 -m :多少字元 -w :多少字? 范例: [root @test /root]# cat /etc/passwd | wc -l <==這個(gè)檔案里頭有多少行? [root @test /root]# cat /etc/passwd | wc -w <==這個(gè)檔案里頭有多少字!?
· 說(shuō)明:
wc 也可以當(dāng)作指令?呵呵!這可不是上洗手間的 WC 呢!這是相當(dāng)有用的計(jì)算檔案內(nèi)容的一個(gè)工具組喔!舉個(gè)例子來(lái)說(shuō),當(dāng)你要知道目前你的帳號(hào)檔案中有多少個(gè)帳號(hào)時(shí),就使用上面的 wc -l 啦!因?yàn)?/etc/passwd 里頭一行代表一個(gè)使用者呀!所以知道行數(shù)就曉得有多少的帳號(hào)在里頭了!而如果要計(jì)算一個(gè)檔案里頭有多少個(gè)字元時(shí),呵呵!就使用 wc -w 這個(gè)參數(shù)吧!
o uniq
語(yǔ)法:
[root @test /root ]# uniq 參數(shù)說(shuō)明: 范例: [root @test /root]# last | cut -d" " -f1 | sort | uniq
o 說(shuō)明:
這個(gè)指令用來(lái)將『重復(fù)的行刪除掉只顯示一個(gè)』,舉個(gè)例子來(lái)說(shuō),你要知道這個(gè)月份登入你主機(jī)的使用者有誰(shuí),而不在乎他的登入次數(shù),那么就使用上面的范例, (1)先將所有的資料列出;(2)再將人名獨(dú)立出來(lái);(3)經(jīng)過(guò)排序;(4)只顯示一個(gè)!由于這個(gè)指令是在將重復(fù)的東西減少,所以當(dāng)然需要『配合排序過(guò)的檔案』來(lái)處理啰!例如我們偵測(cè) Nimda 病毒的時(shí)候會(huì)用到的這個(gè)小指令即是!基本上,這個(gè)小程式可以讓大家很清楚的知道命令重導(dǎo)向與管線處理的用途啰!
o tee
語(yǔ)法:
[root @test /root ]# last | tee last.list | cut -d " " -f1 參數(shù)說(shuō)明: 范例: [root @test /root]# last | tee last.list | cut -d " " -f1
o 說(shuō)明:
有沒(méi)有發(fā)現(xiàn)在Linux Bash Shell命令重導(dǎo)向的時(shí)候,如果我們要將資料送出到檔案的時(shí)候,螢?zāi)簧暇筒粫?huì)出現(xiàn)任何的資料!那么如果我們需要將資料同時(shí)顯示在螢?zāi)簧细鷻n案中呢?呵呵!這個(gè)時(shí)候就需要 tee 這個(gè)指令啰!使用 last 可以查看到這個(gè)月份的登入資料,而使用了 tee 之后,會(huì)將資料同時(shí)傳給下一個(gè)命令去執(zhí)行,也會(huì)將資料寫入 last.list 這個(gè)檔案中!也是個(gè)好幫手!
o tr
語(yǔ)法:
[root @test /root ]# tr [-ds] SET1 參數(shù)說(shuō)明: -d?。簞h除 SET1 這個(gè)字串 -s?。喝〈糁貜?fù)的字元! 范例: [root @test /root]# last | tr '[a-z]' '[A-Z]' <==將小寫改成大寫 [root @test /root]# cat /etc/passwd | tr -d : <==嘿嘿! : 這個(gè)符號(hào)在 /etc/passwd 中不見(jiàn)了! [root @test /root]# cat /home/test/dostxt | tr -d '\r' > dostxt-noM <==將 DOS 檔案的字尾符號(hào) ^M 的符號(hào)去除!
o 說(shuō)明:
其實(shí)這個(gè)指令也可以寫在『正規(guī)表示法』里頭!因?yàn)樗彩怯烧?guī)表示法的方式來(lái)取代資料的!以上面的例子來(lái)說(shuō),使用 [] 可以設(shè)定一串字呢!也常常用來(lái)取代檔案中的怪異符號(hào)!例如上面第三個(gè)例子當(dāng)中,可以去除 DOS 檔案留下來(lái)的 ^M 這個(gè)斷行的符號(hào)!這東西相當(dāng)?shù)挠杏?!相信處?Linux & Windows 系統(tǒng)中的人們最麻煩的一件事就是這個(gè)事情啦!亦即是 DOS 底下會(huì)自動(dòng)的在美行行尾加入 ^M 這個(gè)斷行符號(hào)!這個(gè)時(shí)候我們可以使用這個(gè) tr 來(lái)將 ^M 去除! ^M 可以使用 \r 來(lái)代替之!
o split
語(yǔ)法:
[root @test /root ]# split [-bl] 輸入檔案 輸出檔案前導(dǎo)字元 參數(shù)說(shuō)明: -b :以檔案 size 來(lái)分 -l?。阂孕袛?shù)來(lái)分 范例: [root @test /root]# split -l 5 /etc/passwd test <==會(huì)產(chǎn)生 testaa, testab, testac... 等等的檔案
o 說(shuō)明:
在 Windows 的情況下,你要將檔案分割需要如何作?!傷腦筋吧!呵呵!在 Linux 底下就簡(jiǎn)單的多了!你要將檔案分割的話,那么就使用 -b size 來(lái)將一個(gè)分割的檔案限制其大小,如果是行數(shù)的話,那么就使用 -l line 來(lái)分割!好用的很!如此一來(lái),你就可以輕易的將你的檔案分割成 floppy 的大小,方便你 copy 啰!
管線命令在 bash 的連續(xù)的處理程序中是相當(dāng)重要的!另外,在 log file 的分析當(dāng)中也是相當(dāng)重要的一環(huán),所以請(qǐng)?zhí)貏e留意!好嘛???
【編輯推薦】