标签:重定向和管道
程序:指令+ 数据
读入数据:Input
输出数据:Output
打开的文件都有一个fd:file 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 [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:
[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
有时被称为就地文本(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 | …
将命令1的STDOUT发送给命令2的STDIN,命令2的STDOUT发送到命令3的STDIN
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...
重定向到多个目标
$ 命令1 | tee 名 文件名 | 命令2
把命令1 的STDOUT 保存在文件名中,然后管道输入给命令2
使用:
保存不同阶段的输出
复杂管道的故障排除
同时查看和记录输出
本文出自 “Alan” 博客,请务必保留此出处http://songzz2016.blog.51cto.com/8713945/1833031
标签:重定向和管道
原文地址:http://songzz2016.blog.51cto.com/8713945/1833031