Linux中的管道和IO重定向

2023-05-16

Linux中的管道和IO重定向

管道技术是什么?

管道是linux中进程之间的通信技术, 核心思想是先进先出(FRIST IN, FIRST OUT, FIFO), 管道的英文是pipeline, 这个词很生动地描述了数据和信息在进程之间的流动就像在水管中一样.

管道应用

管道的符号是 “ | ”, 利用管道通信的基本格式是:

command1 | command2 | command3 | … | commandn

在上述命令中, command1 的输出作为command2的输入, 并继续在command们中按照先后顺序流动. 到了commandn, 它的输出就会被直接显示在shell上.
比如我们经常可以见到用管道来帮助我们寻找文件的语句:

ls | grep data

输出是当前路径下所有名称包含data的文件:

data_folder                                            
test_data  

利用管道,配合cat, more, sed, awk等显示和文字处理\提取的工具,可以有很多非常灵活的应用.
比如在shell中逐行显示当前路径下的文件: ls | more
或者逐行显示某文件内容: cat | more
比如和sed配合, sed命令的标准格式是:

sed [选项]... {脚本(如果没有其他脚本)} [输入文件]...

我们可以用cat等类似命令将数据送入管道, 然后交给sed处理, 这时, sed的命令中就不必指定input了.例如:打印当前路径下的前5个文件名称:

ls -l | sed -n '1,5p'

例如显示包含指定内容的行:

cat preprocess.py | sed -n '/import/p'

得到输出:

import os
#import sys
import argparse

上述这个命令当然也可以不用管道来实现: sed -n '/import/p' preprocess.p 可以得到同样的结果. 管道更多地被应用在更复杂的情况下. 例如下面这个例子就结合了管道, 调用命令行工具进行变量赋值和sed.

dl@DL~/$var1='Windows Pipeline is quite useful'
dl@DL:~$ replace=Linux
dl@DL:~$ var2=`echo $var1 | sed "s/Window/$replace/g"`
dl@DL::~$  echo $var2
Linuxs Pipeline is quite useful

和管道特别相近,也经常配合一起使用的技术是I/O重定向, 下面来谈谈这个.

I/O重定向

什么是I/O重定向?

I/O重定向就是说将文件\命令\程序\脚本,甚至代码块的输出发送到另外一个文件/程序等作为输入.等等,这不是和管道差不多么? 没错, 实际上, 管道只是I/O重定向中的一种, 仅仅是命令之间的输出输入传递, 其他的重定向符号指定的是命令和系统标准输出输入之间的数据传递.
这里必须要首先谈谈文件标识符(File Descriptor, FD), 当linux启动一个进程的时候,系统会自动为这个进程打开三个文件: 标准输入(FD=0), 标准输出(FD=1), 标准错误输出(FD=2). 下图中描述了这三者和shell命令之间的关系:

这里写图片描述
命令行工具和系统交互的过程中,经常用到的重定向符号还有:

> filename将标准输出写到文件中
>> filename 将标准输入写入文件中, 如果文件内已经存在内容,则在文件末尾开始继续写入
<filename 将文件读入标准输入中

说明: <符号的用法

dl@DL:~$ wc -l .vimrc
410 .vimrc
dl@DL:~$ wc -l <.vimrc
410

这里用到了wc命令. 这条指令可以帮助我们计算文件的Byte数、字数或是列数,若不指定文件名称,或是所给予的文件名为“-”,则wc指令会从标准输入设备读取数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux中的管道和IO重定向 的相关文章

  • 为什么我的代码在编译用于分析 (-pg) 时在多线程下运行比在单线程下运行慢?

    我正在写一个光线追踪器 最近 我在程序中添加了线程 以利用 i5 四核上的附加内核 奇怪的是 应用程序的调试版本现在运行速度变慢 但优化后的构建运行速度比添加线程之前更快 我将 g pg 标志传递给 gcc 以进行调试构建 并将 O3 标志
  • PHP 日志文件颜色

    我正在编写一个 PHP 日志文件类 但我想为写入文件的行添加颜色 我遇到的问题是颜色也会改变终端的颜色 我想要实现的是仅更改写入日志文件的行的颜色 class logClass extends Singleton private funct
  • 使用 hcitool 扫描低功耗蓝牙?

    当我运行此命令时 BLE 设备扫描仅持续 5 秒 sudo timeout 5s hcitool i hci0 lescan 输出显示在终端屏幕中 但是 当我将输出重定向到文件以保存广告设备的地址时 每次运行该命令时 我都会发现该文件是空的
  • 在 MacO 和 Linux 上安装 win32com [重复]

    这个问题在这里已经有答案了 我的问题很简单 我可以安装吗win32com蟒蛇API pywin32特别是 在非 Windows 操作系统上 我一直在Mac上尝试多个版本pip install pywin32 都失败了 下面是一个例子 如果你
  • 在Linux中创建可执行文件

    我计划做的一件事是编写 非常简单的 Perl 脚本 并且我希望能够在不从终端显式调用 Perl 的情况下运行它们 我明白 要做到这一点 我需要授予他们执行权限 使用 chmod 执行此操作非常简单 但它似乎也是一个稍微费力的额外步骤 我想要
  • 路由是否会影响具有绑定源地址的套接字?

    假设我有两个网络接口 eth0有地址10 0 0 1 eth1有地址192 168 0 1 Using route or ip route add我已将其设置为路由 所有地址至eth0 1 2 3 4只为了eth1 所以数据包到1 2 3
  • 如何从 Linux 命令行确定 LCD 显示器是否打开

    如何通过 Linux 命令行判断计算机的显示器是否打开 关闭 我传统上认为显示器是仅输出的设备 但我注意到 Gnome 显示器首选项对话框具有 检测显示器 功能 这可以推广到确定显示器是否物理关闭吗 VESA DDC 连接是I2C http
  • 即使使用 rvm pkg install zlib 后也无法加载此类文件 -- zlib

    我使用 rvm 安装了 zlib 包和 ruby 1 9 3 但是每当我尝试安装时 它说宝石cannot load such file zlib 我用来安装的命令是 rvm install 1 9 3 rvm pkg install zli
  • Linux 阻塞与非阻塞串行读取

    I have 这段代码 https stackoverflow com questions 6947413 how to open read and write from serial port in c用于在Linux中从串行读取 但我不
  • 如果目录不存在,有没有办法让 mv 创建要移动到的目录?

    因此 如果我在主目录中并且想将 foo c 移动到 bar baz foo c 但这些目录不存在 是否有某种方法可以自动创建这些目录 以便你只需要输入 mv foo c bar baz 一切都会顺利吗 似乎您可以将 mv 别名为一个简单的
  • %config(noreplace) 文件上出现意外的 RPM 冲突

    我正在创建我自己的RPM using rpmbuild My RPM 包含配置文件哪个应该永远不会被覆盖 即使 RPM 包含这些配置文件的新版本 为了存档这个 我用以下标签标记了它们 config noreplace opt mypacka
  • 在Linux中将日期附加到文件名

    我想在文件名旁边添加日期 somefile txt 例如 somefile 25 11 2009 txt 或 somefile 25Nov2009 txt 或任何类似的内容 也许脚本或终端窗口中的某些命令可以执行 我正在使用Linux Ub
  • 为什么“script”命令会生成 ^[ 和 ^M 字符以及如何使用 vim 搜索和替换删除它们?

    在linux上 使用bash shell 当我使用script命令时 生成的文件称为typescript 当我用 vim 打开该文件时 每一行都包含 M字符 并且有几行 由于我的彩色命令提示符 包含一个字符 我想用任何东西替换这些字符 从而
  • 如何防止 CMake 在构建时(而不是安装时)为共享库创建符号链接?

    我正在使用 CMake 在 Linux 上使用 Bullet3 构建一个项目 在构建整个解决方案时 它会构建附加了 SOVERSION 的 Bullet 输出库 并创建一个不带版本的符号链接 对于我的特定场景 我不喜欢这种行为 并且我不想编
  • 动态加载库和共享全局符号

    由于我在动态加载的库中观察到全局变量的一些奇怪行为 因此我编写了以下测试 首先我们需要一个静态链接库 头文件test hpp ifndef BASE HPP define BASE HPP include
  • bash.sh 运行 cron 的权限被拒绝

    如何在这里使用 bash 脚本运行 cron 我做了如下操作 这里有错误 我想知道如何在 ubuntu 中做到这一点 我现在对它感到震惊 bash sh 文件 bin bash cd var www Controller usr bin p
  • 如何使用 shell 脚本解压所有 .tar.gz?

    我试过这个 DIR path tar gz if ls A DIR 2 gt dev null then echo not gz else tar zxvf path tar gz C path tar fi 如果该文件夹有一个 tar 则
  • 如何从powershell获取主机名?

    我如何获得hostname https stackoverflow com q 42014215 262852 for dur来自 powershell PS home thufir powershell gt PS home thufir
  • 终止 ssh 会话会终止正在运行的进程

    我正在使用 ssh 连接到我的 ubuntu 服务器 我使用命令启动编码程序 然而 似乎当我的 ssh 会话关闭时 因为我在进入睡眠状态的笔记本电脑上启动它 有没有办法避免这种情况 当然 阻止我的笔记本电脑休眠并不是永久的解决方案 运行你的
  • 查找当前打开的文件句柄数(不是 lsof )

    在 NIX系统上 有没有办法找出当前正在运行的进程中有多少个打开的文件句柄 我正在从正在运行的进程中寻找在 C 中使用的 API 或公式 在某些系统上 见下文 您可以在 proc pid fd 中对它们进行计数 如果不属于其中之一 请参阅下

随机推荐

  • 深度学习caffe框架(1):如何快速上手caffe?

    初识caffe 安装caffe跑一个例子mnist配置caffe框架的深度学习网络结构输入数据 数据层的定义图片数据如何保存为lmdb格式 模型的保存和读取 caffe的代码层次参考 初识caffe 安装caffe 跑一个例子 mnist
  • 深度学习caffe框架(2): layer定义

    caffe的代码层次 首先让我们回顾一下caffe的代码层次 blob layer net和solver 其中blob是数据结构 layer是网络的层 net是将layer搭建成的网络 solver是网络BP时候的求解算法 本节主要介绍ca
  • 安装Qt及相关问题解决

    安装Qt及相关问题解决 Download Qt 1 Qt下载 关于Qt下载 xff0c 官网可以下载 但是需要填一大堆信息 非常麻烦 可以打开下面的链接 xff0c 里面有各版本Qt http download qt io archive
  • 可编程的SQL是什么样的?

    背景 如果你使用传统编程语言 xff0c 比如Python xff0c 那么恭喜你 xff0c 你可能需要解决大部分你不需要解决的问题 xff0c 用Python你相当于拿到了零部件 xff0c 而不是一辆能跑的汽车 你花了大量时间去组装汽
  • matplotlib 绘制动画

    matplotlib动画 载入matplotlib动画绘制工具 span class hljs import span class hljs keyword import span matplotlib animation span cla
  • Robust Real-Time Extreme Head Pose Estimation

    基本思路 xff1a 用RGB D 的摄像头 xff0c 利用RGB和深度信息对人脸进行三位建模和合成 之后建立了一个由33个人不同头部姿态点云合成数据组成的数据库Dali3DHP xff0c 基于级联决策树 xff08 5个 xff09
  • 如何将ipython的历史记录导出到.py文件中?

    python绝对是生产力工具 真的太好用了 python jupyter提供了非常好的交互编程方式 最棒的就是在数据分析过程中 可以把想法和代码实现放在一起 大大加速了分析过程 也使得代码的可读性更好 回到上面的问题 两种办法解决 xff1
  • keras上手系列之: 模型的保存

    如何将训练好的网络进行保存以便以后使用 进行后续的研究呢 首先 定义一个简单的LSTM模型 span class hljs keyword from span keras models span class hljs keyword imp
  • keras上手系列之: 代码的整体框架

    keras的名字来源于希腊史诗 lt 奥德赛 gt 里的牛角之门 Gate of Horn 是追梦者之路 是梦想实现之门 Those that come through the Ivory Gate cheat us with empty
  • keras上手系列之:序列到序列预测问题

    LSTM序列到序列模型种类 LSTM 序列到序列 seq to seq 问题建模 根据问题和数据本身的特点 可以分为几种不同 一对一 one to one 多对一 many to one 一对多 one to many 多对多 many t
  • keras上手之:与tensorflow混合编程

    tensorflow具备许多优秀的函数和功能 xff0c 比如tensorboard xff0c keras作为tensorflow的高级API xff0c 封装很多tensorflow的代码 xff0c 使得代码模块化 xff0c 非常方
  • 贝叶斯网络和概率推理(一):理性决策与朴素贝叶斯

    在实际问题中 xff0c 理性决策 xff08 rational decision xff09 就意味着必须对结果出现的相关因素及其重要性 xff0c 以及目标实现的可能性进行合理评估 由于未知和惰性 xff0c 让我们对问题中的每个 因果
  • DTI数据处理: from scanner to statistics

    安装准备 工具 FSL MRIcron 准备工作 MRIcron安装 MRIcron的下载地址 http www mccauslandcenter sc edu mricro mricron dcm2nii html FSL安装 FSL是一
  • 核磁数处理和数据分析的资源汇总-不断更新

    在线电子书 xff1a http www magnetic resonance org 几个专业名词 axial diffusivity AD fractional anisotropy FA mean diffusion MD radia
  • 如何将Python算法模型注册成Spark UDF函数实现全景模型部署

    本文作者来自Byzer社区 amp Kyligence 机器学习平台工程师 Andie Huang 背景 Background 对于算法业务团队来说 xff0c 将训练好的模型部署成服务的业务场景是非常常见的 通常会应用于三个场景 xff1
  • linux系统下c/cpp编译链接时系统的默认搜索路径

    C C 43 43 程序在linux下被编译和连接时 xff0c GCC G 43 43 会查找系统默认的include和link的路径 xff0c 以及自己在编译命令中指定的路径 自己指定的路径就不说了 xff0c 这里说明一下系统自动搜
  • 核磁数据处理: FSL系列之segmentation工具FAST

    fsl的segmentation工具 FAST FMRIB s Automated Segmentation Tool 将大脑组织的3D影响分解为不同的组织 比如灰质 白质 脑脊液等等 同时还可以进行spatial intensity va
  • 核磁数据处理: FSL系列之bet命令

    bet命令用于脑组织的提取 有GUI和命令行两种调用方式 下图是bet的GUI界面 在shell中输入命令Bet就可以启动bet的GUI界面了 界面非常简单 只需要制定输入图像 设置图像密度阈值f 选择bet命令执行的方式 Run stan
  • MRI数据处理: FSL线性配准flirt命令

    flirt 是FSL的线性修正工具 官方提供了非常丰富的调用方式 命令Flirt可以启动FLIRT的GUI 43 InvertXFM ApplyXFM ConcatXFM命令flirt 是命令行工具misc flirt utilities
  • Linux中的管道和IO重定向

    Linux中的管道和IO重定向 管道技术是什么 管道是linux中进程之间的通信技术 核心思想是先进先出 FRIST IN FIRST OUT FIFO 管道的英文是pipeline 这个词很生动地描述了数据和信息在进程之间的流动就像在水管