管道命令的使用

  bash命令执行的时候有输出数据,如果这群数据比寻经过几道手续之后才能得到我们所需要的格式,就涉及到管道命令(pipe),管道命令使用"|"这个界定符号,另外管道命令和连续执行命令是不一样的。

  管道命令"|"仅能够处理经由前面一个命令传来的正确信息,也就是standard output的信息,对于standard error并没有直接处理的能力。在每个管道后面接的第一个数据必定是命令,而且这个命令必须能够接收standard input的数据才行,这样的命令才可以是管道命令。至于ls , cp , mv 等就不是管道命令,因为ls , cp , mv 并不会接受来之stdin的数据。也就是说管道命令有两个特点:

(1)管道命令仅会处理standard output,对于standard error output会予以忽略

(2)管道命令必须要能够接收来自前一个命令的数据成为standard input继续处理才行。

一、选取命令cut、grep,针对"行"来分析。
cut:
-d     :     后面接分隔符,与-f一起使用。
-f     :     依据-d的分隔符将一段信息切割成为数段,用-f取出第几段的意思。
-c     :     以字符(characters)的单位取出固定字符区间
例子:
lq@ubuntu:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
lq@ubuntu:~$ echo $PATH | cut -d ':' -f 3-5
/usr/sbin:/usr/bin:/sbin
lq@ubuntu:~$ echo $PATH | cut -d ':' -f 3,5
/usr/sbin:/sbin
lq@ubuntu:~$ echo $PATH | cut -d ':' -f 2
/usr/local/bin
 
grep:
-i     :     忽略大小写
-v     :     反向选择,即显示没有"查找串内容"的一行
-n     :     显示输出行号
例子:
lq@ubuntu:~$ last | grep -n 'lq'
1:lq       pts/2        115.156.187.51   Fri Jun 27 10:23   still logged in
9:lq       pts/7        115.156.187.51   Wed Jun 25 20:17 - 20:37  (00:20)
10:lq       pts/6        115.156.187.51   Wed Jun 25 19:59 - 21:31  (01:31)
11:lq       pts/4        115.156.187.51   Wed Jun 25 19:56 - 21:31  (01:35)
14:lq       pts/1        115.156.187.51   Wed Jun 25 19:35 - 21:31  (01:55)
18:lq       pts/3        115.156.187.51   Tue Jun 24 16:31 - 16:31  (00:00)
74:lq       pts/3        115.156.187.51   Sat Jun 14 15:42 - 15:52  (00:09)
388:lq       pts/0        115.156.187.51   Thu Apr 17 15:26 - 15:27  (00:00)
397:lq       pts/3        115.156.187.51   Wed Apr 16 15:33 - 18:59  (03:25)
 
二、排序命令sort、wc、uniq
sort:
-r     :     反向排序
-t     :     分隔符
-k     :     以那个区间来进行排序
例子:
lq@ubuntu:~$ cat /etc/passwd | sort
backup:x:34:34:backup:/var/backups:/bin/sh
bind:x:107:113::/var/cache/bind:/bin/false
bin:x:2:2:bin:/bin:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
 
lq@ubuntu:~$ cat /etc/passwd |sort -t ':' -k 3
root:x:0:0:root:/root:/bin/bash
ubuntu:x:1000:1000:ubuntu,,,:/home/ubuntu:/bin/bash
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
lrx:x:1001:1001:,,,:/home/lrx:/bin/bash
 
lq@ubuntu:~$ cat /etc/passwd | cut -d ':' -f 1 | sort
backup
bin
bind
daemon
 
uniq:
-i     :     忽略大小写
-c     :     计数
例子:
lq@ubuntu:~$ last | cut -d ' ' -f 1 | sort | uniq -c
      1
      1 graduate
     13 jie
     11 lq
      4 lrx
    159 pc
 
wc:
-l     :     列出行数
-w     :     列出多少字(英文单字)
-m     :     多少字符
例子:
lq@ubuntu:~$ cat /etc/issue | wc
      2       5      26
三列分别为行数、字数、字符数
 
三、双向重定向tee
tee:
-a     :     已累计的方式加入文件
例子:
lq@ubuntu:~$ last | tee last.list | cut -d " " -f1
 
四、字符转换命令tr、col、join、paste、expand
tr:
-d     :     删除一段字符串
-s     :     替换掉重复的字符
 
例子:
替换掉小写字符,变成大写字符
lq@ubuntu:~$ last | tr '[a-z]' '[A-Z]'
删掉冒号
lq@ubuntu:~$ last | tr -d ':'
 
col:
-x     :     将tab键转换为对等的空格键
-b     :     在文字内有反斜杠(/)时,仅保留反斜杠最后接的字符
root@ubuntu:~$ man col | col -b > /root/col.man
col经常被利用于将man page转存为纯文本文件以方便查阅的功能。
 
五、切割命令split
split:
-b     :     后面接切割成的文件大小,可加单位如b,k,m等
-l     :     以行数进行切割
lq@ubuntu:/mnt/fuse$ split -l 4 index.php index.php
lq@ubuntu:/mnt/fuse$ ls -al
drwxrwxrwx  3 root   root     4096 Jul  1 16:21 .
drwxr-xr-x 10 root   root     4096 Jun 18 15:40 ..
-rwxr--r--  1 nobody nogroup  1295 Jun 18 20:22 index.php
-rw-rw-r--  1 lq     lq         98 Jul  1 16:21 index.phpaa
-rw-rw-r--  1 lq     lq        161 Jul  1 16:21 index.phpab
-rw-rw-r--  1 lq     lq        211 Jul  1 16:21 index.phpac
-rw-rw-r--  1 lq     lq        200 Jul  1 16:21 index.phpad
-rw-rw-r--  1 lq     lq        280 Jul  1 16:21 index.phpae
-rw-rw-r--  1 lq     lq        213 Jul  1 16:21 index.phpaf
-rw-rw-r--  1 lq     lq        132 Jul  1 16:21 index.phpag
 
将上面的文件合并可用:
lq@ubuntu:/mnt/fuse$ cat index.phpa* >> index.php.backup
 
六、参数代换xargs
xargs:
例子:
将/etc/passwd内的第一行取出,仅取三列,使用finger显示账号内容
lq@ubuntu:~$ cut -d ':' -f 1 /etc/passwd | head -n 3 | xargs finger
Login: root                             Name: root
Directory: /root                        Shell: /bin/bash
Last login Thu May 29 09:29 (CST) on pts/1 from ppt-20130509oii
No mail.
No Plan.

Login: daemon                           Name: daemon
Directory: /usr/sbin                    Shell: /bin/sh
Never logged in.
No mail.
No Plan.

Login: bin                              Name: bin
Directory: /bin                         Shell: /bin/sh
Never logged in.
No mail.
No Plan.

 

posted @ 2014-07-01 16:47  简简单单-平平淡淡  阅读(2121)  评论(0编辑  收藏  举报