标准I/O和管道

程序:指令+数据

  • 读入数据:Input
  • 输出数据:Output

打开的文件都有一个fd: file descriptor (文件描述符)

Linux给程序提供三种 I/O 设备

  • 标准输入(STDIN)-0 默认接受来自终端窗口的输入
  • 标准输出(STDOUT)-1 默认输出到终端窗口
  • 标准错误(STDERR)-2 默认输出到终端窗口

I/O重定向:改变默认位置

文件描述符在系统中的位置:

[root@centos8 ~]#ls -l /proc/$$/fd
total 0
lrwx------. 1 root root 64 Oct 5 09:06 0 -> /dev/pts/0
lrwx------. 1 root root 64 Oct 5 09:06 1 -> /dev/pts/0
lrwx------. 1 root root 64 Oct 5 09:06 2 -> /dev/pts/0
lrwx------. 1 root root 64 Oct 5 09:08 255 -> /dev/pts/0
lr-x------. 1 root root 64 Oct 5 09:06 3 -> /var/lib/sss/mc/passwd
lrwx------. 1 root root 64 Oct 5 09:06 4 -> 'socket:[48411]'

这就是系统运行时内存中对应的文件描述符对应的文件,0,1,2都输出向终端,而重定向即可改变标准输入,输出,错误的输出位置。

hostame >a.txt
#不同命令的标准输入输出是由系统或者程序判定的,而不是想当然的认为是输出或者错误,有时候标准错误可能只是一个提示而已

标准输入要求有内容,并且是一次传入的,在命令执行时就已经读取并执行了,之后再传入内容也不会再输入了

输出和错误重新定向到文件

STDOUT和STDERR可以被重定向到文件

  • 命令 操作符号 文件名

支持的操作符号包括:

  • > 把STDOUT重定向到文件
  • 2> 把STDERR重定向到文件
  • &> 把所有输出重定向到文件

> 文件内容会被覆盖

  • set -C 禁止将内容覆盖已有文件,但可追加
  • >| file 强制覆盖
  • set +C 允许覆盖

>> 原有内容基础上,追加内容

2> 覆盖重定向错误输出数据流

2>> 追加重定向错误输出数据流

标准输出和错误输出各自定向至不同位置

  • COMMAND > /path/to/file.out 2> /path/to/error.out

合并标准输出和错误输出为同一个数据流进行重定向

  • &> 覆盖重定向
  • &>> 追加重定向
  • COMMAND > /path/to/file.out 2>&1 (顺序很重要)
  • COMMAND >> /path/to/file.out 2>&1

():合并多个程序的STDOUT

  • ( cal 2007 ; cal 2008 ) > all.txt

tr命令

tr 转换和删除字符

tr [OPTION]... SET1 [SET2]

选项:

  • -c –C --complement:取字符集的补集
  • -d --delete:删除所有属于第一字符集的字符
  • -s --squeeze-repeats:把连续重复的字符以单独一个字符表示
  • -t --truncate-set1:将第一个字符集对应字符转化为第二字符集对应的字符
SETs are specified as strings of characters.  Most represent themselves.
Interpreted sequences are: \NNN character with octal value NNN (1 to 3 octal digits)
\\ backslash
\a audible BEL
\b backspace
\f form feed
\n new line
\r return
\t horizontal tab
\v vertical tab
CHAR1-CHAR2 all characters from CHAR1 to CHAR2 in ascending order
[CHAR*] in SET2, copies of CHAR until length of SET1
[CHAR*REPEAT] REPEAT copies of CHAR, REPEAT octal if starting with 0
[:alnum:] all letters and digits
[:alpha:] all letters
[:blank:] all horizontal whitespace
[:cntrl:] all control characters
[:digit:] all digits
[:graph:] all printable characters, not including space
[:lower:] all lower case letters
[:print:] all printable characters, including space
[:punct:] all punctuation characters
[:space:] all horizontal or vertical whitespace
[:upper:] all upper case letters
[:xdigit:] all hexadecimal digits
[=CHAR=] all characters which are equivalent to CHAR

输入重定向和管道

从文件导入STDIN

使用 < 来重定向标准输入

某些命令能够接受从文件中导入的STDIN

  • tr ‘a-z’ ‘A-Z’< /etc/issue

    该命令会把/etc/issue中的小写字符都转换成大写字符

删除fstab文件中的所有abc中任意字符

  • tr –d abc < /etc/fstab

cat > file

  • 123
  • 45678
  • 按ctrl+d离开,可以使用文件来代替键盘的输入

cat < file1 > file2

cat < file1 >> file1

把多行发送给STDIN

使用“<<终止词”命令从键盘把多行重导向给STDIN

  • 直到 终止词 位置的所有文本都发送给STDIN
  • 有时被称为就地文本(here documents)
mail -s "Please Call" root <<END
> Hi Wang
>
> Please give me a call when you get in. We may need
> to do some maintenance on server1.
>
> Details when you're on-site
> Zhang
> END

管道

管道(使用符号“|”表示)用来连接命令:

  • 命令1 | 命令2 | 命令3 | …

    • 将命令1的STDOUT发送给命令2的STDIN,命令2的STDOUT发送到命令3的STDIN
    • STDERR默认不能通过管道转发,可利用2>&1 或 |& 实现
    • 最后一个命令会在当前shell进程的子shell进程中执行
    • 组合多种工具的功能
      • ls | tr ‘a-z’ ‘A-Z’

示例:

  • less :一页一页地查看输入

    • ls -l /etc | less
  • mail: 通过电子邮件发送输入
    • echo "test email" | mail -s "test" root
  • bc:算术运算
    • echo "2^3" |bc

管道中的-符号:

  • 临时的匿名变量
  • 示例: 将 /home 里面的文件打包,但打包的数据不是记录到文件,而是传送到 stdout,经过管道后,将 tar -cvf - /home 传送给后面的 tar -xvf - , 后面的这个 - 则是取

    前一个命令的 stdout,因此,就不需要使用临时file了

    • tar -cvf - /home | tar -xvf -

重定向到多个目标(tee)

命令1 | tee [-a ] 文件名 | 命令2

  • 把命令1的STDOUT保存在文件中,做为命令2的输入
  • -a 追加

使用:

  • 保存不同阶段的输出
  • 复杂管道的故障排除
  • 同时查看和记录输出

文件中字符显示颜色

echo -e '\e[31;1mred\e[0m'

[[31mred[[0m 这是再vim中标识字符颜色

^[这个是一个字符,同时按住Ctrl+v松开摁左方向键就可以打出来了

\e[31m 代表颜色开始

\e[0m 代表颜色结束,其实是无色开始,也就是代表有颜色结束了

tr -d:删除目标内容比如'\n'换行符,再比如' '空格符等

tr ' ' +< bc.log > bc2.log 将bc.log中的空格替换为+然后输出到bc2.log文件中

cat > cat.log时,时单行重定向,写入一行回车时即写入文件

cat > cat.log <<EOF 这时候输入换行也不会写入文件,只有当输入EOF这个结束符时结束输入文件,这个EOF可以替换为其他字符,同时这串字符前面不能有其他字符,空格也不行

<<即为多行重定向

如果向让第一个命令的标准输出作为第二个命令的标准输入就可以使用管道

echo {1..100} |tr ' ' + |bc 将1到100展开,然后传给tr将空格替换为加号,然后传给bc计算

seq -s +100 这样就会输出1+2+..+100的数字

5-1 标准I/O和管道的更多相关文章

  1. 初学Linux之标准I/O和管道

    标准输入和输出 程序是由指令+数据组成 程序的数据流有三种: 输入数据流:<–标准输入(stdin),一般默认是键盘 输出数据流:–>标准输出(stdout),一般默认到终端窗口 错误输出 ...

  2. 标准 I/O 和管道

    1.标准输入和输出1>程序:指令+数据(指令服务于数据) 读入数据:input 输出数据:output 2>三种 I/O 设备 Linux 给程序提供三种 I/O 设备 标准输入(STDI ...

  3. 了解有哪几个C标准&了解C编译管道

    下列哪个不是C标准.参考:C语言标准 小知识:C语言标准的发展 K&R C: 1978年,丹尼斯·里奇(Dennis Ritchie)和布莱恩·科尔尼干(Brian Kernighan)出版了 ...

  4. C语言----管道

    一.管道的概念 管道是一种队列类型的数据结构,它的数据从一端输入,另一端输出.管道最常见的应用是连接两个进程的输入输出,即把一个进程的输出编程另一个进程的输入.shell中存在专门的管道运算符&quo ...

  5. Linux Shell中管道的原理及C实现框架

    在shell中我们经常用到管道,有没考虑过Shell是怎么实现管道的呢? cat minicom.log | grep "error" 标准输入.标准输出与管道 我们知道,每一个进 ...

  6. GoJS研究,简单图表制作。

    话不多说,先上图 我在这个中加入了缩略图.鼠标放大缩小等功能. <!doctype html> <html> <head> <title>Flowcha ...

  7. Node.js规范化应用

    Node.js运行在一个单线程模式,但它使用一个事件驱动范例来处理并发.它还有助于创建子进程,以充分利用并行处理的多核CPU系统. 子进程总是有三个流child.stdin,child.stdout和 ...

  8. Linux & Python 导航目录

    < Python学习手册(第4版)>< Python Cookbook(第2版)>中文版.pdf< Python 高级编程>< Python 基础教程 第二版 ...

  9. 网络技术教程笔记(20)ISDN

    广域网与接入网技术 广域网与接入网技术 常见接入技术--ISDN 综合业务数字网(Integrated Services Digital Network,ISDN)由电话综合数字网IDN演化而成,能够 ...

随机推荐

  1. PassengerNginxdebian快速部署Rails

    Passenger/Nginx/Debian快速部署Rails   PassengerNginxdebian快速部署Rails     安装所需的linux包 sudo apt-get install ...

  2. puppet完全攻略(二)让puppet代码支持vim高亮显示

    puppet完全攻略(二)让puppet代码支持vim高亮显示 2012-06-10 13:33:01 标签:puppet viong puppet完全攻略 原创作品,允许转载,转载时请务必以超链接形 ...

  3. js swal()弹出框

    做前端开发的时候时常会遇到修改成功.新增成功这类弹出框,用alert的话未免有点太low了,而swal()是一个简单又实用的弹出框方法 alert 弹出框样式如下: swal() 弹出框样式如下: 代 ...

  4. python--AutoPy库

    包括用于控制键盘和鼠标,在屏幕上查找颜色和位图以及显示警报的功能 - 所有这些都是以跨平台,高效和简单的方式进行的.适用于Mac OS X,Windows和X11 中文文档:https://blog. ...

  5. Swoole:PHP7安装Swoole的步骤

    下载 swoole 首先下载swoole的源码包,这个操作很简单,没有太多说的.(没有wget:brew install wget--mac) wget -c https://github.com/s ...

  6. noi.ac #535 生成树

    题目链接:戳我 我们考虑按照编号依次加点,然后维护一个栈. 预设生成树的颜色为color. 对于当前点x,如果它和栈首的点连边颜色相同,那么他们的连边可以作为生成树上面的边,点i已经连接,直接brea ...

  7. python创建文件夹方法

    def mkdir(path): # 引入模块 import os # 去除首位空格 path = path.strip() # 去除尾部 \ 符号 path = path.rstrip(" ...

  8. ubuntu安装扩展在phpinfo显示不出来的解决办法

    在Ubuntu中使用apt-get安装了php扩展(比如redis.memcache.memcached等),在终端输入php -m是显示已加载,但是在phpinfo中无法显示,这个时候需要重启一下p ...

  9. Linux 服务器安装jdk,mysql,tomcat简要教程

    linux服务器是阿里云上买的,学生价9.9/月,拿来学习下. 需要准备软件工具: 1.editplus (编辑服务器上的文件) 2.PuTTY (Linux命令连接器) 3.FlashFXP(上传文 ...

  10. 安装指定版本的Ionic或Cordova

    安装ionic 及 cordova npm install -g cordova ionic更新命令 npm update -g cordova ionic安装特定版本 npm install -g ...