bash命令执行的时候有输出数据,如果这群数据比寻经过几道手续之后才能得到我们所需要的格式,就涉及到管道命令(pipe),管道命令使用"|"这个界定符号,另外管道命令和连续执行命令是不一样的。
管道命令"|"仅能够处理经由前面一个命令传来的正确信息,也就是standard output的信息,对于standard error并没有直接处理的能力。在每个管道后面接的第一个数据必定是命令,而且这个命令必须能够接收standard input的数据才行,这样的命令才可以是管道命令。至于ls , cp , mv 等就不是管道命令,因为ls , cp , mv 并不会接受来之stdin的数据。也就是说管道命令有两个特点:
一、选取命令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)
-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
-l : 列出行数
-w : 列出多少字(英文单字)
-m : 多少字符
例子:
lq@ubuntu:~$ cat /etc/issue | wc
2 5 26
三列分别为行数、字数、字符数
-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.