linux管道符合 详解,Linux Shell管道详解

通过前面的学习,我们已经知道了怎样从文件重定向输入,以及重定向输出到文件。Shell 还有一种功能,就是可以将两个或者多个命令(程序或者进程)连接到一起,把一个命令的输出作为下一个命令的输入,以这种方式连接的两个或者多个命令就形成了管道(pipe)。

Linux 管道使用竖线|连接多个命令,这被称为管道符。Linux 管道的具体语法格式如下:command1 | command2

command1 | command2 [ | commandN... ]

当在两个命令之间设置管道时,管道符|左边命令的输出就变成了右边命令的输入。只要第一个命令向标准输出写入,而第二个命令是从标准输入读取,那么这两个命令就可以形成一个管道。大部分的 Linux 命令都可以用来形成管道。这里需要注意,command1 必须有正确输出,而 command2 必须可以处理 command2 的输出结果;而且 command2 只能处理 command1 的正确输出结果,不能处理 command1 的错误信息。

为什么使用管道?

我们先看下面一组命令,使用 mysqldump(一个数据库备份程序)来备份一个叫做 wiki 的数据库:mysqldump -u root -p '123456' wiki > /tmp/wikidb.backup

gzip -9 /tmp/wikidb.backup

scp /tmp/wikidb.backup username@remote_ip:/backup/mysql/

上述这组命令主要做了如下任务:mysqldump 命令用于将名为 wike 的数据库备份到文件 /tmp/wikidb.backup;其中-u和-p选项分别指出数据库的用户名和密码。

gzip 命令用于压缩较大的数据库文件以节省磁盘空间;其中-9表示最慢的压缩速度最好的压缩效果。

scp 命令(secure copy,安全拷贝)用于将数据库备份文件复制到 IP 地址为 remote_ip 的备份服务器的 /backup/mysql/ 目录下。其中username是登录远程服务器的用户名,命令执行后需要输入密码。

上述三个命令依次执行。然而,如果使用管道的话,你就可以将 mysqldump、gzip、ssh 命令相连接,这样就避免了创建临时文件 /tmp/wikidb.backup,而且可以同时执行这些命令并达到相同的效果。

使用管道后的命令如下所示:mysqldump -u root -p '123456' wiki | gzip -9 | ssh username@remote_ip "cat > /backup/wikidb.gz"

这些使用了管道的命令有如下特点:命令的语法紧凑并且使用简单。

通过使用管道,将三个命令串联到一起就完成了远程 mysql 备份的复杂任务。

从管道输出的标准错误会混合到一起。

上述命令的数据流如下图所示:

20191014_1571024775262129.png

重定向和管道的区别

乍看起来,管道也有重定向的作用,它也改变了数据输入输出的方向,那么,管道和重定向之间到底有什么不同呢?

简单地说,重定向操作符>将命令与文件连接起来,用文件来接收命令的输出;而管道符|将命令与命令连接起来,用第二个命令来接收第一个命令的输出。如下所示:command > file

command1 | command1

有些读者在学习管道时会尝试如下的命令,我们来看一下会发生什么:command1 > command2

答案是,有时尝试的结果将会很糟糕。这是一个实际的例子,一个 Linux 系统管理员以超级用户(root 用户)的身份执行了如下命令:cd /usr/bin

ls > less

第一条命令将当前目录切换到了大多数程序所存放的目录,第二条命令是告诉 Shell 用 ls 命令的输出重写文件 less。因为 /usr/bin 目录已经包含了名称为 less(less 程序)的文件,第二条命令用 ls 输出的文本重写了 less 程序,因此破坏了文件系统中的 less 程序。

这是使用重定向操作符错误重写文件的一个教训,所以在使用它时要谨慎。

Linux管道实例

【实例1】将 ls 命令的输出发送到 grep 命令:[www.found5.com]$ ls | grep log.txtlog.txt

上述命令是查看文件 log.txt 是否存在于当前目录下。

我们可以在命令的后面使用选项,例如使用-al选项:[www.found5.com]$ ls -al | grep log.txt

-rw-rw-r--.  1 louis louis    0 4月  15 17:26 log.txt

管道符|与两侧的命令之间也可以不存在空格,例如将上述命令写作ls -al|grep log.txt;然而我还是推荐在管道符|和两侧的命令之间使用空格,以增加代码的可读性。

我们也可以重定向管道的输出到一个文件,比如将上述管道命令的输出结果发送到文件 output.txt 中:[www.found5.com]$ ls -al | grep log.txt >output.txt

[www.found5.com]$ cat output.txt

-rw-rw-r--.  1 louis louis    0 4月  15 17:26 log.txt

【实例2】使用管道将 cat 命令的输出作为 less 命令的输入,这样就可以将 cat 命令的输出每次按照一个屏幕的长度显示,这对于查看长度大于一个屏幕的文件内容很有帮助。cat /var/log/message | less

【实例3】查看指定程序的进程运行状态,并将输出重定向到文件中。[www.found5.com]$ ps aux | grep httpd > /tmp/ps.output

[www.found5.com]$ cat /tem/ps.output

mozhiyan  4101     13776  0   10:11 pts/3  00:00:00 grep httpd

root      4578     1      0   Dec09 ?      00:00:00 /usr/sbin/httpd

apache    19984    4578   0   Dec29 ?      00:00:00 /usr/sbin/httpd

apache    19985    4578   0   Dec29 ?      00:00:00 /usr/sbin/httpd

apache    19986    4578   0   Dec29 ?      00:00:00 /usr/sbin/httpd

apache    19987    4578   0   Dec29 ?      00:00:00 /usr/sbin/httpd

apache    19988    4578   0   Dec29 ?      00:00:00 /usr/sbin/httpd

apache    19989    4578   0   Dec29 ?      00:00:00 /usr/sbin/httpd

apache    19990    4578   0   Dec29 ?      00:00:00 /usr/sbin/httpd

apache    19991    4578   0   Dec29 ?      00:00:00 /usr/sbin/httpd

【实例4】显示按用户名排序后的当前登录系统的用户的信息。[www.found5.com]$ who | sort

louis :0           2019-04-16 12:55 (:0)

louis pts/0        2019-04-16 13:16 (:0)

who 命令的输出将作为 sort 命令的输入,所以这两个命令通过管道连接后会显示按照用户名排序的已登录用户的信息。

【实例5】统计系统中当前登录的用户数。[www.found5.com]$ who | wc -l

5

管道与输入重定向

输入重定向操作符

command1 

例如,使用 tr 命令从 os.txt 文件中获取输入,然后通过管道将输出发送给 sort 或 uniq 等命令:[www.found5.com]$ cat os.txt

redhat

suse

centos

ubuntu

solaris

hp-ux

fedora

centos

redhat

hp-ux

[www.found5.com]$ tr a-z A-Z 

CENTOS

CENTOS

FEDORA

HP-UX

HP-UX

REDHAT

REDHAT

SOLARIS

SUSE

UBUNTU

[www.found5.com]$ tr a-z A-Z 

CENTOS

FEDORA

HP-UX

REDHAT

SOLARIS

SUSE

UBUNTU

管道与输出重定向

你也可以使用重定向操作符>或>>将管道中的最后一个命令的标准输出进行重定向,其语法如下所示:command1 | command2 | ... | commandN > output.txt

command1  output.txt

【实例1】使用 mount 命令显示当前挂载的文件系统的信息,并使用 column 命令格式化列的输出,最后将输出结果保存到一个文件中。[www.found5.com]$ mount | column -t >mounted.txt

[www.found5.com]$ cat mounted.txt

proc         on  /proc                  type  proc        (rw,nosuid,nodev,noexec,relatime)

sysfs        on  /sys                   type  sysfs       (rw,nosuid,nodev,noexec,relatime,seclabel)

devtmpfs     on  /dev                   type  devtmpfs    (rw,nosuid,seclabel,size=496136k,nr_inodes=124034,mode=755)

securityfs   on  /sys/kernel/security   type  securityfs  (rw,nosuid,nodev,noexec,relatime)

tmpfs        on  /dev/shm               type  tmpfs       (rw,nosuid,nodev,seclabel)

devpts       on  /dev/pts               type  devpts      (rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=000)

tmpfs        on  /run                   type  tmpfs       (rw,nosuid,nodev,seclabel,mode=755)

tmpfs        on  /sys/fs/cgroup         type  tmpfs       (rw,nosuid,nodev,noexec,seclabel,mode=755)

#####此处省略部分内容#####

【实例2】使用 tr 命令将 os.txt 文件中的内容转化为大写,并使用 sort 命令将内容排序,使用 uniq 命令去除重复的行,最后将输出重定向到文件 ox.txt.new。[www.found5.com]$ cat os.txt

redhat

suse

centos

ubuntu

solaris

hp-ux

fedora

centos

redhat

hp-ux

[www.found5.com]$ tr a-z A-Z os.txt.new

[www.found5.com]$ cat os.txt.new

CENTOS

FEDORA

HP-UX

REDHAT

SOLARIS

SUSE

UBUNTU

本文来自投稿,不代表访得立场,如若转载,请注明出处:http://www.found5.com//view/806.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值