一,I/O重定向
-
重定向正常输出
-
> :覆盖以存在文件的内容,很危险的操作
-
>>:如果文件已经存在,则是在原内容的最后追加。
-
可以禁止>的覆盖行为,使用
set -C
。只在当前会话有效。set +C
恢复覆盖行为。# set -C # cat /etc/issue > /tmp/is1 -bash: /tmp/is1: cannot overwrite existing file # cat /etc/issue >| /tmp/is1
-
>|:
set -C
已经禁止了覆盖,但是确认就是要覆盖,可以使用。
-
-
重定向错误输出
- 2>:覆盖以存在文件的内容,很危险的操作
- 2>>:如果文件已经存在,则是在原内容的最后追加。
- 2>|:强制覆盖
-
合并重定向正常输出和错误输出
- &>:覆盖以存在文件的内容,很危险的操作
- &>>:如果文件已经存在,则是在原内容的最后追加。
- &>|:不支持,语法报错。
-
把错误输出,重定向到正常输出:2>&1
# cat /etc/issue2 >> /tmp/is1 2>&1
如果命令产生的是正常输出,则重定向到/tmp/is1;如果产生的是错误输出,则把错误输出重定向到正常输出。由于正常输出已经重定向到了/tmp/is1了,所以错误输出也重定向到了/tmp/is1.
-
重定向输入:
<
支持文件作为参数的命令,可以不使用
<
,也能够重定向输入,比如cat
# cat < /etc/issue \\S Kernel \\r on an \\m # cat /etc/issue \\S Kernel \\r on an \\m
不支持文件作为参数的命令,必须明确使用
<
,才能够重定向输入。比如tr
tr
命令用途:替换或者删除特定的字符语法:
tr [OPTION]... SET1 [SET2]
-
把输入的1替换成2,把输入的2替换成4
$ tr [12] [34] 12//输入的12 34//被替换成了34 22//输入的22 44//被替换成了44
-
利用重定向,把文件里的小写字母,全部替换成相应的大写字母,把结果显示到标准输出。
# cat /etc/issue \\S Kernel \\r on an \\m # tr [:lower:] [:upper:] < /etc/issue \\S KERNEL \\R ON AN \\M
-
利用重定向,把文件里的小写字母,全部删除后,把结果显示到标准输出。
# cat /etc/issue \\S Kernel \\r on an \\m # tr -d [a-z] < /etc/issue \\S K \\ \\
-
-
<<
:是干什么的?<<后面的词作为结尾,把内容重定向到文件里# cat > /tmp/is1.out << EOF > hello > cat cat > EOF # cat /tmp/is1.out hello cat cat
-
特殊设备:/dev/null
重定向到/dev/null,就相当于消失了。
在shell脚本程序里,当关心的是,命令的执行结果(成功,还是失败),而不是命令执行后的输出的时候,就可以把命令的输出重定向到/dev/null里。
例子:只想知道/etc/passwd文件里是否有第一行,而不关心第一行的内容时,使用下面的命令。
# head -1 /etc/passwds &> /dev/null # echo $? 1 # head -1 /etc/passwd &> /dev/null # echo $? 0
二,管道
连接程序,把前一个命令的输出作为后一个命令的输入。
command1 | command2 | command3 ...
例子1:把cat的输出,作为tr的输入
# cat /etc/issue
\\S
Kernel \\r on an \\m
# cat /etc/issue | tr [a-z] [A-Z]
\\S
KERNEL \\R ON AN \\M
例子:把who的输出,作为tail的输入,再把tail的输出,作为tr的输入。
# who
ys :0 2019-12-16 10:22 (:0)
ys pts/0 2019-12-16 10:22 (:0)
root pts/1 2019-12-16 10:23 ()
# who | tail -2
aa pts/0 2019-12-16 10:22 (:0)
root pts/1 2019-12-16 10:23 ()
# who | tail -2 | tr [a-z] [A-Z]
AA PTS/0 2019-12-16 10:22 (:0)
ROOT PTS/1 2019-12-16 10:23 ()
重定向后,原来命令的输出就没有了,能够保存上一个命令的输出吗?使用tee
命令。
tee
:read from standard input and write to standard output and files。从标准输入读取,然后写入到标准输出和文件中。
例子:保留cat的输出,并把cat的输出,传递给tr命令
# cat /etc/issue | tee /tmp/is3.out | tr [a-z] [A-Z]
\\S
KERNEL \\R ON AN \\M
# cat /tmp/is3.out
\\S
Kernel \\r on an \\m
练习1:把/etc/passwd文件的前6行的信息转换为大写字母后输出
# head -6 /etc/passwd | tr [a-z] [A-Z]
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN
ADM:X:3:4:ADM:/VAR/ADM:/SBIN/NOLOGIN
LP:X:4:7:LP:/VAR/SPOOL/LPD:/SBIN/NOLOGIN
SYNC:X:5:0:SYNC:/SBIN:/BIN/SYNC