linux学习之旅(四)&& 管道详细

来源:互联网 发布:itools.cn是什么软件 编辑:程序博客网 时间:2024/06/05 23:00

管道 ” | “

管道的作用是将前一条命令的输出变成管道后命令的输入。

*两点注意:

1.它仅能处理经由前面一个指令传出的正确输出信息,对于错误输出信息没有直接处理能力。
2.管理命令的后一个命令必须能将前一个命令的标准输出变为它的标准输入才可以,如 less,more,head,tail就可以,而类如ls, cp, mv就不行。

下图是对管道形象的描述:

  • command1正确输出,作为command2的输入 ;
  • comand2的输出作为comand3的输入 ;
  • comand3输出就会直接显示在屏幕上面了。

    //通过管道之后:comand1,comand2的正确输出不显示在屏幕上面

*下面展示几个管道的利用:

  • 查看此时的进程占用资源,找出内存占用的前五个进程
    这里写图片描述
    //由于进程太多,我们用管道将输出重新处理:

  • 统计ls /bin命令输出的行数:

[kiosk@foundation77 ~]$ ls /bin/  | wc  -l    //用管道将ls的输出重新处理,只接显示统计过的行数1970                    //行数
  • 读出test.sh文件内容,通过管道转发给grep 作为输出
[root@server77 Desktop]# cat test.sh | grep -n 'echo'               1:    echo "very good !";3:    echo "hello wirld !";

tee命令:

  • tee 复制输出到指定位置
date |tee file |wc -l   //tee命令复制date命令的输出到file中,并统计输出行数

管理输入输出

在linux系统中,正确输出的编号为1,错误输出编号为2:

数字0,1,2的详细说明:

*重定向符的用法:

command > filename    //把标准输出重定向到一个新文件中"command >> filename     //把标准输出重定向到一个文件中(追加)command 1> fielname      //把标准输出重定向到一个文件中 command > filename 2>&1    //把标准输出和标准错误一起重定向到一个文件中command 2> filename     //把标准错误重定向到一个文件中command 2>> filename     //把标准输出重定向到一个文件中(追加)command >> filename 2>&1       //把标准输出和标准错误一起重定向到一个文件中(追加)command < filename >filename2     //把command命令以filename文件作为标准输入,以filename2文件作为标准输出command < filename    //把command命令以filename文件作为标准输入command << delimiter   //把从标准输入中读入,直至遇到delimiter分界符command <&m    //把文件描述符m作为标准输入command >&m    //把标准输出重定向到文件描述符m中command <&-    //把关闭标准输入 

*注意: >, 2> ,&> 都会覆盖源文件内容。
tips:
鉴于对重定向的用法,可以发现单独用>的功能:

[root@server77 Desktop]#>file                           //清空file// *注意:>> 2>> &>> 不会覆盖源文件内容,会把相应的输出字符方到文件的最后
  • 因为系统中错误的输出是无法通过管道的。针对这种问题,系统中用 2>&1 可以把错误的输出编号由2变成1

    • 2>&1 把 stderr 转换成 stdout:

下面具体举例分析几个实际中的应用便于理解:

在student用户下执行find /etc -name passwd 命令,保存正确数出到/tmp/find.out,错误数出到/tmp/find.err中:

[kiosk@foundation77 ~]$ find /etc -name passwd 1>/tmp/westos.out 2>/tmp/westos.err[kiosk@foundation77 ~]$ cd /tmp[kiosk@foundation77 tmp]$ cat westos.out /etc/passwd/etc/pam.d/passwd[kiosk@foundation77 tmp]$ cat westos.err | head -n 5   ##由于westos.err都是错误的输出,所以用刚讲到的管道,只看前五行。find: ‘/etc/pki/CA/private’: Permission deniedfind: ‘/etc/pki/rsyslog’: Permission deniedfind: ‘/etc/dhcp’: Permission deniedfind: ‘/etc/lvm/archive’: Permission deniedfind: ‘/etc/lvm/backup’: Permission denied

查找passwd文件全部输出保存在/tmp/westos.all

显示 /bin 中文件包含大写字母的文件 , 保存到bin_westos_file.txt 文件中,并统计个数显示到屏幕
法一:用三剑客命令grep实现:

法二:用基本的正则表达式:

tips:

  • 由于touch创建文件是要写入硬盘的,速度不如写入内存快。所以一般要创建如果可利用重定向的文件就多使用重定向去创建。 如:ls /bin>file …

*从前面的介绍可以看出,通过管道重定向等几种方法的组合,Linux命令可以完成很多看似复杂的功能。除此之外,还可以将这些命令整合写到一个脚本中,加上函数、变量、判断和循环等功能,再加之一些编程思想,就会变成功能更强大的Shell脚本~