Monday, January 19, 2009

管线命令 ( pipe )

    假设我们要读取 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 』,最后到上面那一行,那么就马上可以清楚的知道为何会这么做啰!这个管线命令『 | 』仅能处理经由前面一个指令传来的正确信息,也就是 standard output ( STDOUT ) 的信息,对于 stdandard error 并没有直接处理的能力,请记得。那么整体的管线命令可以使用下图表示之:
     
在每个管线的部分都是『指令』呢!而后一个指令的输入乃是由前一个指令的输出而来的!底下我们来谈一谈一些基本的管线命令指令介绍:
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 档案的时候!


  • 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 这个参数吧!

    • uniq

    • 语法
      [root @test /root ]# uniq
      参数说明:
      范例:
      [root @test /root]# last | cut -d" " -f1 | sort | uniq
      说明
      这个指令用来将『重复的行删除掉只显示一个』,举个例子来说,你要知道这个月份登入你主机的使用者有谁,而不在乎他的登入次数,那么就使用上面的 范例,(1)先将所有的数据列出;(2)再将人名独立出来;(3)经过排序;(4)只显示一个!由于这个指令是在将重复的东西减少,所以当然需要『配合排 序过的档案』来处理啰!

    tee
    语法
    [root @test /root ]# last | tee last.list | cut -d " " -f1
    参数说明:
    范例:
    [root @test /root]# last | tee last.list | cut -d " " -f1
    说明
    有没有发现在命令重导向的时候,如果我们要将数据送出到档案的时候,屏幕上就不会出现任何的数据!那么如果我们需要将数据同时显示在屏幕上跟档案中呢?呵呵!这个时候就需要 tee 这个指令啰!使用 last 可以查看到这个月份的登入数据,而使用了 tee 之后,会将数据同时传给下一个命令去执行,也会将数据写入 last.list 这个档案中!也是个好帮手!

      • 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 的符号去除!
        说明
        其实这个指令也可以写在『正规表示法』里头!因为他也是由正规表示法的方式来取代数据的!以上面的例子来说,使用 [] 可以设定一串字呢!也常常用来取代档案中的怪异符号!例如上面第三个例子当中,可以去除 DOS 档案留下来的 ^M 这个断行的符号!这东西相当的有用!相信处理 Linux & Windows 系统中的人们最麻烦的一件事就是这个事情啦!亦即是 DOS 底下会自动的在每行行尾加入 ^M 这个断行符号!这个时候我们可以使用这个 tr 来将 ^M 去除! ^M 可以使用 \r 来代替之!
    split
    语法
    [root @test /root ]# split [-bl] 输入档案 输出档案前导字符
    参数说明:
    -b :以档案 size 来分
    -l :以行数来分
    范例:
    [root @test /root]# split -l 5 /etc/passwd test <==会产生 testaa, testab, testac... 等等的档案
    说明
    在 Windows 的情况下,你要将档案分割需要如何作?!伤脑筋吧!呵呵!在 Linux 底下就简单的多了!你要将档案分割的话,那么就使用 -b size 来将一个分割的档案限制其大小,如果是行数的话,那么就使用 -l line 来分割!好用的很!如此一来,你就可以轻易的将你的档案分割成 floppy 的大小,方便你 copy 啰!
      管线命令在 bash 的连续的处理程序中是相当重要的!另外,在 log file 的分析当中也是相当重要的一环,所以请特别留意!好嘛!?
    ----from linux-vbird
    bird


    No comments: