码迷,mamicode.com
首页 > 其他好文 > 详细

第五章-重定向和管道

时间:2016-08-01 23:26:19      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:重定向和管道

标准输入和输出

程序:指令+ 数据

读入数据:Input

输出数据:Output


打开的文件都有一个fdfile descriptor ( 文件描述符)


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

标准输入(STDIN        0 默认接受来自键盘的输入

标准输出(STDOUT       1 默认输出到终端窗口

标准错误(STDERR       2 默认输出到终端窗口


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


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

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

命令操作符号 文件名

支持的操作符号包括:

STDOUT重定向到文件

2> STDERR重定向到文件

&> 把所有输出重定向到文件


文件内容会被覆盖

#set –C:禁止将内容覆盖已有文件,但可追加

强制覆盖:>|

#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

find /etc -namepasswd 2> /dev/null

 

() :合并多个程序的STDOUT

(cal 2007 ; cal 2008 ) > all.txt


追加信息到文件中

echo “hello world” >> fa.txt    >> 是追加信息到fa.txt

 

标准输入重定向

cat < xxx                     xxx文件标准输入到cat

cat < xxx > yyy           xxx文件标准输入到cat,在标准输出到yyy

 

合并文件

cat xxx aaa > bbb     xxx文件和aaa文件合并到bbb

 

cat既有标准输入,又有标准输出

cat是单行处理的,必须使用ctrl+c终止程序


设置结束符,多行重定向

cat << eof

[root@localhost testdir]# cat << eof

> abc

> 123

> eof

abc

123

 

设置不可覆盖文件,可以追加

[root@localhost testdir]# set -C

[root@localhost testdir]# echo ‘helloworld‘ > fa.txt

-bash: fa.txt: cannot overwrite existingfile

[root@localhost testdir]#

[root@localhost testdir]# echo ‘helloworld‘ >> fa.txt

[root@localhost testdir]#

[root@localhost testdir]# cat fa.txt

bash: aaa: command not found...

hello world

 

set–C情况下也可以强制覆盖,使用 >|

[root@localhost testdir]# echo ‘welcomehehe‘ >| fa.txt

[root@localhost testdir]#

[root@localhost testdir]# cat fa.txt

welcome hehe

 

set +C允许覆盖

针对当前shell,执行脚本前先关闭,执行后在开启。


tr 命令

tr –  转换和删除字符

tr [OPTION]...SET1 [SET2]

    选项:

-c   --complerment :取字符集的补集

-d   --delete :删除所有属于第一字符集的字符

-s   --squeeze-repeats :把连续重复的字符以单独一个字符表示

                   -t   --truncate-set1 :将第一个字符集对应字符转化为第二字符集对应的字符


删除补集,删除abc的补集,其实就是只保留abc

[root@localhost testdir]# echo ‘abc123‘ |tr -cd ‘abc‘

abc


从文件中导入STDIN

使用< 来重定向标准输入

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

[root@localhost ~]# tr ‘a-z‘ ‘A-Z‘ </etc/issue

\S

KERNEL \R ON AN \M

HELLO \N \T \L

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

 

tr –d abc < /etc/fstab  删除fstab文件中的所有abc中任意字符

 

[root@localhost ~]# cat > filea

mage

wangxiaochun

 

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

[root@localhost~]# cat > filea < fileb


把多行发送给STDIN

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

直到终止词 位置的所有文本都发送给STDIN

有时被称为就地文本(heretext

[root@localhost ~]# mail -s "PleaseCall" admin@magedu.com <<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 |

将命令1STDOUT发送给命令2STDIN,命令2STDOUT发送到命令3STDIN

STDERR 默认不能通过管道转发,可利用2>&1 |& 实现

最后一个命令会在当前shell 进程的子shell 进程中执行用来组合多种工具的功能

    ls| tr ‘a-z‘ ‘A-Z


[root@localhost testdir]# echo $USER | tr‘a-z‘ ‘A-Z‘

ROOT

 

把错误的信息通过标准输出的方式传给管道

[root@localhost testdir]# ls /err |& tr‘a-z‘ ‘A-Z‘

LS: CANNOT ACCESS /ERR: NO SUCH FILE ORDIRECTORY

 

[root@localhost testdir]# aaa 2>&1 |tr ‘a-z‘ ‘A-Z‘

BASH: AAA: COMMAND NOT FOUND...


tee命令

重定向到多个目标

$ 命令1 | tee 文件名命令2

把命令1 STDOUT 保存在文件名中,然后管道输入给命令2

使用:

  保存不同阶段的输出

  复杂管道的故障排除

           同时查看和记录输出


本文出自 “Alan” 博客,请务必保留此出处http://songzz2016.blog.51cto.com/8713945/1833031

第五章-重定向和管道

标签:重定向和管道

原文地址:http://songzz2016.blog.51cto.com/8713945/1833031

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!