管道(Pipe)

參考http://www.cnblogs.com/kkgreen/archive/2012/03/25/2417036.htmlhtml

總而言之,輸出數據有時候會不少,如何過濾到咱們想要的最終結果?用Pipe,符號是 | 服務器

 

擷取命令cut、grepapp

含義:就是將一段數據通過分析後,取出咱們所想要的less

注意:通常來講,擷取訊息一般是針對『一行一行』來分析的編碼

 

1.Cut

格式:cut -d '分隔字符' -f fieldslua

    cut -c 字符區間spa

參數:
-d :後面接分隔字符。與 -f 一塊兒使用;
-f :依據 -d 的分隔字符將一段訊息分割成爲數段,用 -f 取出第幾段的意思;
-c :以字符 (characters) 的單位取出固定字符區間;
htm

 

範例一:去除PATH變量的第三個路徑blog

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin排序

$ echo $PATH | cut -d ':' -f 3
/usr/sbin 

 以冒號爲分割符取出第三個路徑,若是要同時取出多個,好比第三個和第五個,就這樣寫

$ echo $PATH | cut -d ':' -f 3,5
/usr/sbin:/sbin

 

範例二:取出export輸出的第12字符之後的全部字符串

$ export
declare -x HOME="/home/philosophie"
declare -x LANG="zh_CN.UTF-8"
declare -x LANGUAGE="zh_CN:zh"
declare -x LESSCLOSE="/usr/bin/lesspipe %s %s"
declare -x LESSOPEN="| /usr/bin/lesspipe %s"

………………

………………

$ export | cut -c 12-
HOME="/home/philosophie"
LANG="zh_CN.UTF-8"
LANGUAGE="zh_CN:zh"
LESSCLOSE="/usr/bin/lesspipe %s %s"
LESSOPEN="| /usr/bin/lesspipe %s"

 

注意:1.仍是上面提到的,是一行一行處理的,因此是每一行的第12字符開始。

  2.上面是 12- 而不是12。能夠這樣理解,cut還能夠指定區間,好比要12到20之間的,就這樣寫

$ export | cut -c 12-20
HOME="/ho
LANG="zh_
LANGUAGE=
LESSCLOSE

這樣就能體會到爲何是12-了

 

範例三:用 last 將這個月登入者的信息中,僅留下使用者大名

$ last
philosop pts/43 192.168.1.102 Sun Aug 6 18:20 still logged in
philosop pts/41 192.168.1.102 Sun Aug 6 18:20 still logged in
philosop pts/41 192.168.1.103 Sun Aug 6 18:10 - 18:12 (00:02)
philosop pts/41 192.168.1.103 Sun Aug 6 17:56 - 17:59 (00:03)

利用空格做爲分隔符,取出第一個信息便可

$ last | cut -d ' ' -f 1
philosop
philosop
philosop

 

能夠發現,當要處理的數據具備某種格式的時候,用cut能很好的分割出咱們要的數據,能夠用在分析服務器上log文件

注意:cat在遇到多空格的時候是不會看成一個空格處理的,好比有一個文件ab裏面的內容是abc   cb fda b

用空格做爲分隔符找出第一個和第二個信息會這樣寫

$ cat ab | cut -d ' ' -f 1,2
abc

 

能夠發現,並無獲得想要的結果。

 

2.grep

cut是用來檢查每行,把咱們須要的東西(符合咱們要求的東西)提取出來。

grep是檢查每行有沒有符合咱們要求的(好比包含某個字符串),就將這行拿出來

以前有寫 http://www.cnblogs.com/i-love-kobe/p/7281296.html

 

3.排序命令 sort、wc、uniq

sort

格式:sort [-fbMnrtuk] [file or stdin]
參數:
-f :忽略大小寫的差別,例如 A 與 a 視爲編碼相同;
-b :忽略最前面的空格符部分;
-M :以月份的名字來排序,例如 JAN, DEC 等等的排序方法;
-n :使用『純數字』進行排序(預設是以文字型態來排序的);
-r :反向排序;
-u :就是 uniq ,相同的數據中,僅出現一行表明;
-t :分隔符,預設是 tab 鍵;
-k :以那個區間 (field) 來進行排序的意思,

 

範例一:有個a.lua的內容以下

local function fun()
print('i am a function')
end

fun()

 

$ cat a.lua | sort

end
fun()
local function fun()
print('i am a function')

可見是按照每行頭一個字母來排序的

 

範例二:有個文件b是這樣的

$ cat b
fefo:zz:qq:ppp
a:b:c:d
d:c:o:p
ahife:mo:e:ooo

而後按照:做爲分隔符,並對第二欄進行排序

$ cat b | sort -t ':' -k 2
a:b:c:d
d:c:o:p
ahife:mo:e:ooo
fefo:zz:qq:ppp

 

uniq

做用:去掉重複

格式:uniq [-ic]

參數:
-i :忽略大小寫字符的不一樣;
-c :進行計數

 

範例一:last會列出這個月的登入者信息,好比

 

$ last
PhiloJia pts/15 172.20.157.140 Mon Aug 7 09:51 still logged in
ShinekyL pts/13 172.20.156.17 Mon Aug 7 09:48 still logged in
MarkYin pts/11 172.20.156.159 Mon Aug 7 09:44 still logged in
MisakaWa pts/4 172.20.156.13 Mon Aug 7 09:20 still logged in
YuchengM pts/4 172.20.157.138 Sun Aug 6 15:01 - 15:01 (00:00)
YuchengM pts/0 172.20.157.138 Sun Aug 6 15:01 - 15:01 (00:00)

YuchengM pts/0 172.20.157.138 Sun Aug 6 15:01 - 15:01 (00:00)

會發現其中有一些重複的名字信息,若是要將重複的只要列出一個就行了

$ last | cut -d ' ' -f 1 | sort | uniq

HaustWan
JamesYan
JayceHe
JiahaoWu
JinZhang

 

範例二:在範例一的基礎上,打印出每一個人登錄了多少次,也就是每一個名字重複了多少次

$ last | cut -d ' ' -f 1 | sort | uniq -c
1
3 HaustWan
6 JamesYan
3 JayceHe
4 JiahaoWu
2 JinZhang

注意:這裏若是沒有sort的話仍然是會有重複的,因此我猜這個去重的功能應該只是檢測相鄰的

 

wc

做用:統計行數、字數、字符數

格式:wc [-lwm]

參數:
-l :僅列出行;
-w :僅列出多少字(英文單字);
-m :多少字符;

範例一:a.lua裏面只寫了一句Hello World

 

$ cat a.lua | wc
1 2 12  # 分別是行數、字數、字符數

注意:字數和字符數的區別

 

範例二:last輸出的最後兩行並非登入者的帳戶信息,而是一行空格一行wtmp開頭的內容。如今要統計總的登入人次

 

$ last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l
71

若是要去掉重複登入的人,統計一共有多少人登入

$ last | grep [a-zA-Z] | grep -v 'wtmp' | cut -d ' ' -f 1 | sort | uniq | wc -l
16

 

tee

做用:若是用 > 重定向輸出,好比 last > last.list ,那麼last的信息會存入到last.list中,而屏幕不會有輸出,要保存,並且屏幕還要有顯示,就要用到tee

格式:tee [-a] file

參數:-a ,以追加的方式(append),將數據存入file中

好比:last | tee last.list | cut -d " " -f1

tee操做以後還能夠繼續操做,好比上面繼續cut

相關文章
相關標籤/搜索