标准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重定向和管道的主要内容,如果未能解决你的问题,请参考以下文章