linux管道符使用方法 Linux 管道操作符详解

管道操作符 : |

我们在Linux下经常要用到管道操作符,也就是"|",即一个竖线。这个操作符的作用对于经常使用Linux的人来说,看上去十分直观:

不就是将前一个指令的结果交给后一个指令吗?

举个例子:

cat system.log | grep hello复制代码

上面的指令可以让我们过滤出system.log这个文件中包含hello字符串的行,然后打印到屏幕上。

什么叫指令的结果

问题就来了,一个指令的结果是什么,这个说法十分混淆。

是指这个指令输出的日志?是指这个指令的返回码?(有些人可能不知道这东西)还是指啥啥啥的?

实际上,指令的结果这个概念并没有一个严格定义,所以当我们说,一个指令的结果的时候,经常跟业务场景有关系。比如说,一个图像处理程序的结果,就应该是一个图像,这才是合乎常理的。

如何描述 cat 指令的行为

首先我们来看一下 cat system.log 这个指令的行为。

也就是将 system.log 中的内容打印到屏幕上。

这个过程可以细说,因为将内容打印到屏幕上实际上还是不够准确。

那么这里就不得不牵扯出Linux下文件的一些概念。

程序打开文件以及文件描述符

在 Linux 系统中,一个程序是可以打开一个文件的,这个很容易理解。

那么进程(一般正在运行的程序称之为进程)是如何管理文件的呢?

那就是用文件描述符这种东西,这是一个数字以及与之相关联的一堆数据。

一个进程打开一个文件,就会创建一个新的文件描述符,这个数字一般是自增的。比如说,当前的文件描述符是100。那么再打开一个新的文件,这个新的文件的描述符就是101。当然进程如果关闭文件,这个描述符是可以重复利用的。这里不多扯。

如果用图来表示这个概念,应该是下面的样子:

linux管道符使用方法 Linux 管道操作符详解

我们可以看出,不同的数字代表了不同的文件。

那么在哪里能列出一个进程所打开的文件呢?

在Linux下,可以先找到这个进程的PID,假设是 20000

进入如下的目录:

cd /proc/20000/fd复制代码

这个目录存放的就是 20000 这个进程所打开的文件了。ls一下,如图:

linux管道符使用方法 Linux 管道操作符详解

正如我所描述的那样,都是数字。

一些约定俗成的描述符

从上面的图中,我们看到,描述符是从0开始的。那么0是什么文件呢?

在Linux下,每一个进程启动的时候,都会默认打开三个文件,用0 ,1, 2来当做他们的描述符。

那么0, 1, 2分别代表哪三个文件呢?

0 : 代表标准输入1 : 代表标准输出2 : 代表错误输出

也许上面的描述,还是不够清晰。

再进一步,一般来说,

标准输入,就是指 键盘输入标准输出,就是指输出到屏幕错误输出,也是指输出到屏幕

文件描述符的作用

如果你在Linux下,写过读取键盘输入的程序,那么就这样理解。

你读取的其实就是 0 这个描述符所代表的文件的内容:也就是键盘。

如果你使用过类似 print 这种函数,打印过日志的话,那么其实就是往 1 这个描述符所代表的文件里输出内容,对,这个内容通过屏幕展现出来了。

实际上,这种读取和写入的操作,对于所有文件来说都是一样的,至少在使用上来说,是一样的。

都是先打开一个文件,给他一个描述符,然后针对这个描述符进行读或者写。

文件和键盘输入的关系

键盘输入这种操作,在Linux里,会变成一个文件操作,就类似普通的文件那样。这就是Linux的设计,一切皆是文件。不仅仅键盘操作和屏幕打印是文件操作。网络连接读取数据啥的,也都是文件操作,这些也都会产生文件描述符。一个进程同时拥有的文件描述符是有上限的,这个上限可以设置。如果你不信,你可以试试同时打开一万个文件,看看会不会报错,如果报错,观察一下是报的什么错。

可能是这样的错误:

too many opened files复制代码

回到管道操作符 |

cat system.log | grep hello复制代码

我们现在再来描述上面整个指令:

1. cat system.log

cat这个程序打开了system.log这个文件,将system.log的内容,写入 1 这个文件,也就是屏幕上。

2. grep hello

grep 这个程序,试图从 0这个文件中读取数据,然后找到包含hello的行,然后把找到的行,写入到1这个文件中,也就是屏幕上

3. 管道的作用

就是将前一个程序的1绑定到后一个程序的0。

于是,整体才会走通,要不然,cat 的结果就会打印到屏幕,而不是给了 grep。

作者:庖丁解牛链接:https://juejin.cn/post/7081513914840088607

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年6月27日
下一篇 2022年6月27日

相关推荐

  • liunx常用命令

    查找文件:find   find .-name *.rpm 在当前目录中查找rpm包   find .|grep page 在当前目录及其子目录中查找文件名包含page的文件   …

    2022年6月25日
  • 使用Java和Python进行数据统计和分析

    Java 和 Python 是当今最流行的两种计算机语言。两者都非常成熟,并提供了工具和技术生态系统,帮助我们解决数据科学领域出现的挑战性问题。每种语言都各有优势,我们要知道什么时…

    2022年6月28日
  • Java 应用程序的 CPU 使用率飙升原因分析

    1、背景 在服务器上执行某个任务时,系统突然运行缓慢,top 发现cpu飙升,一度接近100%,最终导致服务假死。 2、CPU 使用率怎么计算? CPU% = 1 – …

    2022年7月13日
  • redis在linux上的部署

    1.在官网下载Linux版本redis 2.拷贝到linux服务器上,解压到指定目录 3.解压后得到redis文件夹—–移动到自己知道的文件位置 4.注:r…

    2022年6月20日
  • 新电脑需装的6款黑科技软件,轻松玩转新机,建议提前摸透

    让我康康是哪些小伙伴刚刚入手了新电脑,是不是抱在怀里无从下手啊,不用担心,今天李师傅给大家总结了几款新机必备的实用黑科技软件,点赞收藏码住,找不到可别赖我没提醒! 1、火绒安全(杀…

    2022年6月22日
  • 手机真的会被他人监控?甚至会监控到微信聊天记录?教你如何反制

    手机被他人远程监控,这是一个敏感的话题,也是大众群体所关心的一个问题。手机真的会被他人远程监控吗?微信聊天记录会不会也被他人监控? 手机被他人远程监控指的是程序员通过电脑端、手机端…

    2022年6月18日
  • “古董级”诺基亚功能机跑 Linux 是怎样的画风?

    出品|开源中国 下面这台诺基亚 Linux 手机只是套了诺基亚手机的外壳,里面是作者全新设计的 PCB 主板,其尺寸与诺基亚的原始 PCB 完全相同,所以称其为 “No…

    2022年6月14日
  • 电脑C盘满了变红了,但是又没存东西是怎么回事

    如果确定不是文件占用的(包括桌面、我的文档、QQ、微信文件夹、隐藏文件夹),则可能是开启了系统还原,具体解决方法如下: 一、找到桌面图标“此电脑”右键属性; 二、打开右上角系统保护…

    2022年6月16日
  • Flutter App 模板,共35个页面

    flutter_dating_template flutter 版本的交友 app 模板,总计页面35个,测试数据基于 mockjs 创建。 快速了解 mock 数据分离 &#82…

    2022年6月18日
  • Win11/Win10测试新功能:一键找到占用文件进程

    删除文件时最让人摸不到头脑的提示莫过于“当前文件正在被使用”了,一直以来,Windows都不会给用户任何提示,如何找到这个占用文件的进程,全靠个人本事。 但近日,微软针对Win10…

    2022年11月4日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息