标准IO重定向和管道

Posted 雨中漫步的张超

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了标准IO重定向和管道相关的知识,希望对你有一定的参考价值。

标准I/O重定向和管道

1 标准输入和输出

程序:指令+数据
读入数据:Input
输出数据:Output
打开的文件都有一个fd:file descriptor(文件描述符)
Linux给程序提供三种I/O设备

  • 标准输入(STDIN) -0 默认接受来自终端窗口的输入
  • 标准输出(STDOUT) -1 默认输出到终端窗口
  • 标准错误(STDERR) -2 默认输出到终端窗口
    范例:文件描述符

2 I/O重定向redirect

I/O重定向:将默认的输入,输出或错误对应的设备改变,指向新的目标

2.1 标准输出和错误重新定向

STDOUT和STDERR可以被重定向到指定文件,而非默认的当前终端
格式:
命令 操作符号 文件名
支持的操作符号包括:

1> 或>        把STDOUT重定向到文件
2>            把STDERR重定向到问及爱你
&>            把所有输出重定向到文件

以上如果文件已存在,文件内容会被覆盖

set -C    禁止将内容覆盖已有文件,但可追加,利用>|仍可强制覆盖
set +C    允许覆盖,默认

追加
“>>” 可以在原有内容基础上,追加内容
把输出和错误重新定向追加到文件

>>    追加标准输出重定向至文件
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
合并多个程序
(CMD1;CMD2......)或者{CMD1;CMD2;......;}合并多个程序的STDOUT

2.2 标准输入重定向

从文件导入STDIN,代替当前终端的输入设备,使用<来重定向标准输入
某些命令能够接受从文件中导入的STDIN

2.2.1 tr命令

tr 转换和删除字符
tr [OPTION]... SET1 [SET2]
选项:

-d  --delete:删除所有属于第一字符集的字符
-s  --squeeze-repeats:把连续重复的字符以单独一个字符表示,即去重
-t  --truncate-set1:将第一个字符集对应字符转化为第二字符集对应的字符
-c  -C --complement:取字符集的补集


    \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



[:alnum:]:字母和数字
[:alpha:]: 字母
[:digit:]: 数字
[:lower:]: 小写字母
[:upper:]:大写字母
[:space:]:空白字符
[:print:]: 可打印字符
[:punct:]:标点符号
[:graph:]:图形字符
[:cntrl:]:控制(非打印)字符
[:xdigit:]:十六进制字符

标准输入重定向

利用”<“可以将标准输入重定向
比如:

cat   >  file
mage
wangxiaochun

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

cat <file1 >  file2
cat <file1 >> file1

2.2.3把多行重定向

使用”<<终止词“命令从键盘把多行重导向给STDIN,直到终止词位置之前的所有文本都发送给STDIN,有时被称为就地文本(here documents)
其中终止词可以是任何一个或多个符号,比如:!,@,$,EOF(End Of File),magedu等,其中EOF比较常用

3 管道

3.1 管道

管道(使用符号”|“表示)用来连接多个命令
格式
命令1 | 命令2 | 命令3 | ...
功能说明:

  • 将命令1的STDOUT发送给命令2的STDIN,命令2的STDOUT发送到命令3的STDIN
  • 所有命令会在当前shell进程的子shell进程中执行
  • 组合多种工具的功能
    注意:STDERR默认不能通过管道转发,可利用2>&1或|&实现,格式如下:
命令1  2>&1   | 命令2
命令1   |&    命令2

3.2 管道中-符号

管道中有时会使用-符号
示例:
将/home里面的文件打包,但打包的数据不是记录到文件,而是传送到stdout,经过管道后,将tar-cvf-/home传送给后面的tar-xvf-,后面的这个-则是取前一个命令的stdout,因此,就不需要使用临时file了
tar -cvf - /home | tar -xvf -

3.2 tee命令

利用tee命令可以重定向到多个目标
格式:
命令1 | tee [-a] 文件名 | 命令2
以上可以把命令1的STDOUT保存在文件中,作为命令2的输入
选项:
-a 追加
功能:

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

以上是关于标准IO重定向和管道的主要内容,如果未能解决你的问题,请参考以下文章

IO和管道

管道及IO重定向

Linux中IO重定向和管道

IO重定向及管道

Linux基础管理—— " 标准IO及重定向及管道 "

IO重定向及管道操作