管线命令

上一篇 / 下一篇  2009-04-08 16:04:03 / 个人分类:Linux/Unix

   bash命令执行时会输出数据,如果这些数据必需经过几道手续之后才能得到我们想要的格式,应该如何设定?这就涉及到管线命令的问题(pipe)。管线命令使用的是“|”界定符号。

   假设,我们需要读取last指令中root的登入的次数,步骤如下:

  1. 执行last,将这个月所有人的所有登入数据取出来;
  2. 使用grep将上面输出数据中的root截取出来,其他的不要;
  3. 使用wc这个可以计算行数的指令对上一步所获得的数据进行计算。

   整个命令可以写成:last | grep root | wc -l

  注意:管线命令“|”仅能处理由前一个命令所传来的正确数据,对于错误信息没有直接处理能力。每个管线部分都是指令,前一个指令的输出是后一个指令的输入。

   常用的管线指令:

  • cut

      参数说明:

      -d(delimiter) : 后面接的是分隔符,默认是空格符;

      -c(character) : 后面接的是第几个字符;

      -f(fields)    : 后面接的是第几个字段;

      范例:

      cat /etc/passwd | cut -d ":" -f 1            将passwd文件中每一行里的“:”作为分隔符,列出第一个字段,即用户姓名

      last | cut -d " " -f 1    以空格符作为分隔,列出文件中每一行的第一个字段

      last | cut -c 1-20   将last得到的数据,每一行第1-20个字符取出来

      总结:cut一般常用来分析日志文件。cut主要的用途是将同一行里的数据进行分解,最常用在分析一些数据或文字数据的时候,因为需要以某些字符作为分隔参数,然后将数据进行切割,以取得所需要的数据。

  • sort

      -t 分隔符: 使用分隔符隔开不同的区块,默认是tab;

      +start -end: 有start区块排序到end区块;

      -n: 使用纯数字排序,否则会以字母方式排序;

      -r: 反向排序;

      -u: 相同出现的一行,只列出一次

      范例:

      cat /etc/passwd | sort     将列出来的个人帐号排序

      cat /etc/passwd | sort -t: +2n   将个人帐号以用户ID排序(每一行第1个字段序号为0,序号为2的表示第3个字段,即用户ID)

      cat /etc/passwd | sort -t: +2nr  将个人帐号以用户ID反向排序

      总结:当我们需要比较信息时可以用sort,比如,假设有很多帐号,想知道最大的用户ID是多少,用sort即可知道答案。

  • wc

      参数说明:

      -l: 多少行;

      -m: 多少字符;

      -w:多少字(这里:以分隔符隔开的算一个字);

     总结:wc是一个计算文件内容的工具组。例如,当需要知道账号文件中有多少个帐号时,可以使用wc -l,因为/etc/passwd文件中,一行代表一个用户;需要计算一个文件有多少个字符时,可以使用wc -m。

  • uniq

     范例:

     last | cut -d " " -f1 | sort | uniq

     该指令用来删除重复的行从而只显示一条数据。例如,想要知道这个月登入主机的用户有哪些,而不在乎其登入次数,即可采用上面的指令:(1)先列出所有的数据;(2)将人名单独列出来;(3)排序;(4)删除重复的数据只显示一个。

  • tee

     范例:

     last | tee last.list | cut -d " " -f1

     在命令重定向时,如果将数据重定向到文件,屏幕上就不会出现任何数据。如果需要将数据同时显示在屏幕上和文件中,此时可用tee指令。例如,上面的指令,last可以查到这个月的登入数据,使用tee之后,会将这些数据传给下一个指令,并且会将数据写入到last.list文件中。

  • tr

     参数说明:

     -d : 删除其后接的字符串;

     -s : 取代重复的字符串;

     范例:

     last | tr '[a-z]' '[A-Z]'     将小写的a-z替改成大写

     cat /etc/passwd | tr -d :     删除/etc/passwd文件中的“:”符号

     cat /home/test/dostext | tr -d '\r' >dostext-noM    将dostext文件中行尾符号^M删除

     总结:该指令可用于正规表达法中,因为它也是以正规表达法方式取代数据。以上面的例子作说明,使用[]可以设定一串字符,也常常用它来取代文件中的怪异符号。比如第3个例子,可用它来去除DOS文件中留下来的^M断行符。

  • split

     语法:

     split [bl] 输入文件(需要分隔的文件) 输出文件(分隔以后的文件的文件名前缀)

     参数说明:

     -b : 以文件size来分;

     -l : 以行数来分

     范例:

     split -l 5 /etc/passwd test    会产生testaa,testab,testac等分隔后的文件

     总结:split指令用来分隔文件,可将文件根据大小或行数分隔成任意大小,方便复制。

    


TAG:

 

评分:0

我来说两句

Open Toolbar