管道(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

相关文章
相关标签/搜索