IO重定向及管道
一直都提到,程序:指令+数据
其实程序也有IO,数据的来源有多个地方:文件、外部
可用于输入的设备:文件(linux一切皆文件)
键盘设备、文件系统上的常规文件加载内容、网卡等;
可用于输出的设备:文件(linux一切皆文件)
显示器、文件系统上的常规文件输出保存、网卡等;
程序的数据流有三种:
输入的数据流;<-- 标准输入(stdin),是键盘;
输出的数据流:--> 标准输出(stdout),显示器;
错误输出流: --> 错误输出(stderr),显示器;
fd: file descriptor,文件描述符;所对应标识符如下:
标准输入:0
标准输出:1
错误输出:2
IO重定向:
输出重定向:>
特性:覆盖输出,将anaconda-ks.cfg文件内容覆盖到kk.txt中
[root@test7_1 ~]# cat anaconda-ks.cfg > kk.txt
输出重定向:>>
特性:追加输出,从文件尾部加入
[root@test7_1 ~]# cat anaconda-ks.cfg >> kk.txt
错误输出流重定向:2>,2>>(追加)
[root@test7_1 sh]# cat test.txt 2> error.log
[root@test7_1 sh]# cat error.log
cat: test.txt: No such file or directory
[root@test7_1 sh]# cat test.log 2>> error.log
[root@test7_1 sh]# cat error.log
cat: test.txt: No such file or directory
cat: test.log: No such file or directory
合并正常输出流和错误输出流:
合并输出流也是有覆盖和追加两种方式:
(1) &>, &>>
(2) COMMAND > /path/to/somefile 2>&1
COMMAND >> /path/to/somefile 2>&1
[root@centos7 tmp]# cat /root/anaconda-ks.cfg >> an.cfg 2>&1
注解:查看anaconda-ks.cfg文件内容追加到an.cfg中,如有错误输出也将追加到an.cfg文 件中;
提一下特殊设备:/dev/null
此特殊设备理解为“数据黑洞”,所有的数据扔进去就会被删除
set为shell内部命令,可以设置禁止覆盖输出重定向至已存在文件;(Centos 6)
[root@test1 ~]# set -C
[root@test1 ~]# cat fstab > issue
-bash: issue: cannot overwrite existing file
如果将开启后无法使用重定向功能,此时可使用强制覆盖输出:>|:
[root@test1 ~]# cat fstab >| issue
关闭上述特性:
[root@test1 ~]# set -C
注:set设定只对当前shell生效
输入重定向:<
输入重定向就是将“数据”作为命令的数据输入源,从而对数据做一些操作
先来一个命令:
tr命令:
tr - translate or delete characters
格式:
tr [OPTION]... SET1 [SET2]
把输入的数据当中的字符,凡是在SET1定义范围内出现的,通通一一对位转换为 SET2出现的字符
选项:
-d:删除字符集合
示例1:
tr SET1 SET2 < /PATH/FROM/SOMEFILE
[root@test7_1 sh]# tr S s < ./issue
\s
Kernel \r on an \m
注解:将issue中出现所有大写S,转换成小写s
示例2:
tr -d SET1 < /PATH/FROM/SOMEFILE
[root@test7_1 sh]# tr -d S < ./issue
\
Kernel \r on an \m
注意:不修改原文件
Here Document(此处创建文档):<<
结束符操作两种方式:
cat << EOF
cat > /PATH/TO/SOMEFILE << EOF
示例:
[root@test7_1 sh]# cat << EOF
> hello
> EOF
hello
解释:
EOF为结束符,当输入的内容中有EOF时会退出
管道:
连接程序作用,实现将前一个命令的输出直接定向后一个程序当做输入数据流
可以多级连接:
COMMAND1 | COMMAND2 | COMMAND3 | ...
管道符号: |
[root@test7_1 sh]# cat /etc/issue | tr COS cos
tee命令:
双向管道,意思是输入数据流保留并在次向后一个程序当做输入数据流
格式:
COMMAND | tee /PATH/TO/SOMEFILE
示例:
[root@test1 ~]# cat /etc/issue | tee kkk | tr -d ‘6.4‘
CentOS release (Final)
Kernel \r on an \m
[root@test1 ~]# cat kkk
CentOS release 6.4 (Final)
Kernel \r on an \m
练习1:把/etc/passwd文件的前6行的信息转换为大写字符后输出;
[root@test1 ~]# head -n 6 /etc/passwd | tr ‘a-z‘ ‘A-Z‘
本文出自 “变相怪杰” 博客,请务必保留此出处http://waldenkk.blog.51cto.com/2410270/1929948
原文地址:http://waldenkk.blog.51cto.com/2410270/1929948