就如同前面所说的, bash 命令执行的时候有输出的资料会出现!那么如果这群资料必需要经过几道手续之后才能得到我们所想要的格式,应该如何来设定?这就牵涉到管线命令的问题了( pipe ),管线命令使用的是『 | 』这个界定符号!另外,管线命令与『连续下达命令』是不一样的呦!这点底下我们会再说明。底下我们先举一个例子来说明一下简单的Linux Bash Shell管线命令。
假设我们要读取 last 这个指令中,那个 root 登入的『次数』应该怎么作?注意呦!我们只需要『次数』。那么我所进行的步骤是:
1. 执行 last ,将所有这个月的所有人登入资料取出来;
2. 使用 grep 将上面的输出资料(stdout)当中的 root 撷取出来,其他的不要;
3. 使用 wc 这个可以计算行数的指令将上一步的资料计算行数!
由于 last 的输出是一行代表一次登入,所以只要计算几行就代表登入几次的意思,所以啰!经由上面三个步骤,将 last 资料逐步的筛选,就可以得到我们的资料了!整个命令可以写成如下:
[test @test bin]# last [test @test bin]# last | grep root [test @test bin]# last | grep root | wc -l
你可以分别执行『 last 』然后再逐步增加为『 last | grep root 』,***到上面那一行,那么就马上可以清楚的知道为何会这么做啰!
底下我们来谈一谈一些基本的Linux Bash Shell管线命令指令介绍:
· cut
语法:
[root @test /root ]# cut -d "分隔字元" [-cf] fields 参数说明: -d :后面接的是用来分隔的字元,预设是『空白字元』 -c :后面接的是『第几个字元』 -f :后面接的是第几个区块? 范例: [root @test /root]# cat /etc/passwd | cut -d ":" -f 1 <==将 passwd 这个档案里面,每一行里头的 : 用来作为分隔号, 而列出***个区块!也就是姓名所在啦! [root @test /root]# last | cut -d " " -f1 <==以空白字元为分隔,并列出***个区间! [root @test /root]# last | cut -c1-20<==将 last 之后的资料,每一行的 1-20 个字元取出来!
· 说明:
这个 cut 实在很好用!不过,说真的,除非你常常在分析 log 档案,否则使用到 cut 的机会并不多!好了! cut 主要的用途在于将『同一行里面的资料进行分解!』,最常使用在分析一些数据或文字资料的时候!这是因为有时候我们会以某些字元当作分割的参数,然后来将资料加以切割,以取得我们所需要的资料。我也很常使用这个功能呢!尤其是在分析 log 档案的时候,跟 awk 也是很常用的!
· sort
语法:
[root @test /root ]# sort [-t 分隔符号] [(+起始)(-结束)] [-nru] 参数说明: -t 分隔符号:使用分隔符号来隔开不同区间,预设是 tab +start -end:由第 start 区间排序到 end 区间 -n:使用『纯数字』排序(否则就会以文字型态来排序) -r :反向排序 -u :相同出现的一行,只列出一次! 范例: [root @test /root]# cat /etc/passwd | sort <==将列出来的个人帐号排序! [root @test /root]# cat /etc/passwd | sort -t: +2n <==将个人帐号中,以使用者 ID 来排序(以 : 来分隔,第三个为 ID ,但***个代号为 0 之故) [root @test /root]# cat /etc/passwd | sort -t: +2nr <==反相排序啰!
· 说明:
sort 同样是很常用的指令呢!因为我们常常需要比较一些资讯啦!举个上面的第二个例子来说好了!今天假设你有很多的帐号,而且你想要知道***的使用者 ID 目前到哪一号了!呵呵!使用 sort 一下子就可以知道答案咯!当然其使用还不止此啦!有空的话不妨玩一玩!
· wc
语法:
[root @test /root ]# wc [-lmw] 参数说明: -l :多少行 -m :多少字元 -w :多少字? 范例: [root @test /root]# cat /etc/passwd | wc -l <==这个档案里头有多少行? [root @test /root]# cat /etc/passwd | wc -w <==这个档案里头有多少字!?
· 说明:
wc 也可以当作指令?呵呵!这可不是上洗手间的 WC 呢!这是相当有用的计算档案内容的一个工具组喔!举个例子来说,当你要知道目前你的帐号档案中有多少个帐号时,就使用上面的 wc -l 啦!因为 /etc/passwd 里头一行代表一个使用者呀!所以知道行数就晓得有多少的帐号在里头了!而如果要计算一个档案里头有多少个字元时,呵呵!就使用 wc -w 这个参数吧!
o uniq
语法:
[root @test /root ]# uniq 参数说明: 范例: [root @test /root]# last | cut -d" " -f1 | sort | uniq
o 说明:
这个指令用来将『重复的行删除掉只显示一个』,举个例子来说,你要知道这个月份登入你主机的使用者有谁,而不在乎他的登入次数,那么就使用上面的范例, (1)先将所有的资料列出;(2)再将人名独立出来;(3)经过排序;(4)只显示一个!由于这个指令是在将重复的东西减少,所以当然需要『配合排序过的档案』来处理啰!例如我们侦测 Nimda 病毒的时候会用到的这个小指令即是!基本上,这个小程式可以让大家很清楚的知道命令重导向与管线处理的用途啰!
o tee
语法:
[root @test /root ]# last | tee last.list | cut -d " " -f1 参数说明: 范例: [root @test /root]# last | tee last.list | cut -d " " -f1
o 说明:
有没有发现在Linux Bash Shell命令重导向的时候,如果我们要将资料送出到档案的时候,萤幕上就不会出现任何的资料!那么如果我们需要将资料同时显示在萤幕上跟档案中呢?呵呵!这个时候就需要 tee 这个指令啰!使用 last 可以查看到这个月份的登入资料,而使用了 tee 之后,会将资料同时传给下一个命令去执行,也会将资料写入 last.list 这个档案中!也是个好帮手!
o tr
语法:
[root @test /root ]# tr [-ds] SET1 参数说明: -d :删除 SET1 这个字串 -s :取代掉重复的字元! 范例: [root @test /root]# last | tr '[a-z]' '[A-Z]' <==将小写改成大写 [root @test /root]# cat /etc/passwd | tr -d : <==嘿嘿! : 这个符号在 /etc/passwd 中不见了! [root @test /root]# cat /home/test/dostxt | tr -d '\r' > dostxt-noM <==将 DOS 档案的字尾符号 ^M 的符号去除!
o 说明:
其实这个指令也可以写在『正规表示法』里头!因为他也是由正规表示法的方式来取代资料的!以上面的例子来说,使用 [] 可以设定一串字呢!也常常用来取代档案中的怪异符号!例如上面第三个例子当中,可以去除 DOS 档案留下来的 ^M 这个断行的符号!这东西相当的有用!相信处理 Linux & Windows 系统中的人们最麻烦的一件事就是这个事情啦!亦即是 DOS 底下会自动的在美行行尾加入 ^M 这个断行符号!这个时候我们可以使用这个 tr 来将 ^M 去除! ^M 可以使用 \r 来代替之!
o split
语法:
[root @test /root ]# split [-bl] 输入档案 输出档案前导字元 参数说明: -b :以档案 size 来分 -l :以行数来分 范例: [root @test /root]# split -l 5 /etc/passwd test <==会产生 testaa, testab, testac... 等等的档案
o 说明:
在 Windows 的情况下,你要将档案分割需要如何作?!伤脑筋吧!呵呵!在 Linux 底下就简单的多了!你要将档案分割的话,那么就使用 -b size 来将一个分割的档案限制其大小,如果是行数的话,那么就使用 -l line 来分割!好用的很!如此一来,你就可以轻易的将你的档案分割成 floppy 的大小,方便你 copy 啰!
管线命令在 bash 的连续的处理程序中是相当重要的!另外,在 log file 的分析当中也是相当重要的一环,所以请特别留意!好嘛!?
【编辑推荐】