一、重定向概述
1.重定向的含义
将原本要输出到屏幕的数据信息,重新定向到某个指定的文件中或目录下的文件中
2.重定向的用途
1.当屏幕输出的信息很重要,而且希望保存重要的信息时;
2.后台执行中的程序,不希望他干扰屏幕正常的输出结果时;
3.系统的例行命令, 例如定时任务的执行结果,希望可以存下来时;
4.一些执行命令,我们已经知道他可能出现错误信息, 想将他直接丢弃时;
5.错误日志与正确日志需要分别输出至不同的文件保存时。
二、标准输入与输出
三个标准文件,分别是标准输入、标准输出、错误输出
| 名称 | 文件描述符 | 作用 |
|---|---|---|
| 标准输入(STDIN) | 0 | 默认是键盘,也可以是文件或其他命令的输出。 |
| 标准输出(STDOUT) | 1 | 默认输出到屏幕。 |
| 错误输出(STDERR) | 2 | 默认输出到屏幕。 |
进程将从标准输入中得到数据,将正常输出打印至屏幕终端,将错误的输出信息也打印至屏幕终端。
示例图:
image
1)以 cat 命令为例, cat 命令的功能是从命令行给出的文件中读取数据,并将这些数据直接送到标准输出。
会把文件/etc/passwd的内容输出显示到屏幕上
[root@oldboy ~]# cat /etc/passwd
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
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
cui-01:x:1000:1000::/home/cui-01:/bin/bash
cui:x:1001:1001::/home/cui:/bin/bash
cui-20:x:1002:1003::/home/cui-20:/bin/bash
cui-21:x:1003:1004::/home/cui-21:/bin/bash
oldboy:x:1004:1006::/home/oldboy:/bin/bash
oldgirl:x:1005:1007::/home/oldgirl:/bin/bash
[root@oldboy ~]#
1.输出重定向
输出重定向,改变输出内容的位置。输出重定向有如下几种方式,如表格所示
| 各种类型 | 操作符号 | 用途 |
|---|---|---|
| 1、标准覆盖输出重定向 | > | 将程序输出的正确结果输出到指定的文件中,会覆盖文件原有的内容 |
| 2、标准追加输出重定向 | >> | 将程序输出的正确结果以追加的方式输出到指定文件,不会覆盖原有文件 |
| 3、错误覆盖输出重定向 | 2> | 将程序的错误结果输出到执行的文件中,会覆盖文件原有的内容 |
| 4、错误追加输出重定向 | 2>> | 将程序输出的错误结果以追加的方式输出到指定文件,不会覆盖原有文件 |
| 5、标准输入重定向 | << | 将命令中接收输入的途径由默认的键盘更改为指定的文件或命令 |
| 6、混合输出 (覆盖) | &> | 将输出正确和错误的结果指定到同一文件中(/dev/null ) |
| 7、混合输出 (追加) | &>> | /将输出正确和错误的结果追加到同一文件中,不覆盖原有内容tmp/t.log |
1)例1: 标准输出重定向,每次都会覆盖文件 (>或1>)

image
- 标准输出重定向, 先清空,后写入, 如果文件不存在则创建
[root@oldboy ~]# cat 1.txt 查看原文件1.txt中的内容
123
321
4568988
[root@oldboy ~]# ifconfig ens33 > 1.txt
[root@oldboy ~]# cat 1.txt
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.200 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80::a863:247c:e43:883a prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:66:98:7e txqueuelen 1000 (Ethernet)
RX packets 634 bytes 57895 (56.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 480 bytes 57934 (56.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@oldboy ~]#
2)例2: 标准输出重定向,往文件的尾部在添加内容 (>>)

image
- 标准追加输出重定向, 向配置文件末尾追加内容
[root@oldboy ~]# echo "崔鑫鹏 你好!" >> 1.txt
[root@oldboy ~]# cat 1.txt
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.200 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80::a863:247c:e43:883a prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:66:98:7e txqueuelen 1000 (Ethernet)
RX packets 634 bytes 57895 (56.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 480 bytes 57934 (56.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
崔鑫鹏 你好!
[root@oldboy ~]#
3)例3: 错误输出重定向(2>)和追加(2>>)

image
1、错误输出至一个文件(2>)
[cui-01@oldboy ~]$ ls
1.txt 22
[cui-01@oldboy ~]$ cd 1.txt
-bash: cd: 1.txt: Not a directory
[cui-01@oldboy ~]$ cd 1.txt 2> cuowu.txt
[cui-01@oldboy ~]$ cat cuowu.txt
-bash: cd: 1.txt: Not a directory
2、错误输出追加至同一文件(2>>)
[cui-01@oldboy ~]$ cd 22
-bash: cd: 22: Not a directory
[cui-01@oldboy ~]$ cd 22 2>> cuowu.txt
[cui-01@oldboy ~]$ cat cuowu.txt
-bash: cd: 1.txt: Not a directory
-bash: cd: 22: Not a directory
4)例4: 正确和错误都输入到相同位置

image
[cui-01@oldboy ~]$ find /etc/ &> wode.txt
[cui-01@oldboy ~]$ cat wode.txt
/etc/vmware-tools/GuestProxyData/server/cert.pem
/etc/vmware-tools/GuestProxyData/trusted
find: ‘/etc/vmware-tools/GuestProxyData/trusted’: Permission denied
/etc/audisp
find: ‘/etc/audisp’: Permission denied
/etc/audit
find: ‘/etc/audit’: Permission denied
/etc/postfix
/etc/postfix/access
...
5)例5: 重定向到空设备/dev/null

image
#将产生的任何数据放入黑洞设备,则视为丢弃。
[cui-01@oldboy ~]$ find /etc/ 2> /dev/null
/etc/.updated
/etc/aliases.db
/etc/vimrc
/etc/wgetrc
/etc/resolv.conf.B6EY5Z
...
6)例6: 脚本中使用重定向 (了解即可)
[root@oldboy~]# vim ping.sh
ping -c1 10.0.0.1
if [ $? -eq 0 ];then
echo "10.0.0.1 is up."
else
echo "10.0.0.1 is down."
fi
[root@oldboy~]# chmod +x ping.sh
[root@oldboy ~]# ./ping.sh
#改进后版
[root@oldboy ~]# vim ping.sh
ping -c1 10.0.0.1 &>/dev/null
if [ $? -eq 0 ];then
echo "10.0.0.1 is up."
else
echo "10.0.0.1 is down."
fi
2.输入重定向
输入重定向,即原本从键盘等上获得的输入信息,重定向由命令的输出作为输入。< 等价 0<
1)例1: 从文件中读入输入的操作
1.没有改变输入的方向,默认键盘
[root@oldboy ~]# mail alice
Subject: hello
1111
2222
3333
. 结束
EOT
2.检查是否收到邮件
[root@oldboy ~]# su - alice
[root@oldboy ~]# mail
3.输入重定向,来自于文件
[root@oldboy ~]# mail -s "test01" alice < /etc/hosts
2)例2: 利用重定向建立多行数据的文件*
手动执行 shell 命令
[root@oldboy ~]# echo "111" > file1.txt
[root@oldboy ~]# cat file1.txt
111
[root@oldboy~]# cat >file2.txt
111
222
333
^D (Ctrl+D)
[root@xuliangwei ~]# cat >>file3.txt
aaa
bbb
ccc
^D (Ctrl+D)
3)例3: 脚本中打印菜单的一种使用方法。
[root@oldboy ~]# vim vm.sh
cat <<-EOF
+------------------- --- ---- --- -- - + |
| ====================== |
| 虚拟机基本管理 v5.0 |
| by xuliangwei |
| ====================== |
| 1\. 安装 KVM |
| 2\. 安装或重置 CentOS-6.9 |
| 3\. 安装或重置 CentOS-7.4 |
| 5\. 安装或重置 Windows-7 |
| 6\. 删除所有虚拟机 |
| q. 退出管理程序 |
+------------------- --- ---- --- +
EOF
4)例4: 两条命令同时重定向,后台执行符号:&
[root@oldboy~]# ls; date &>/dev/null
[root@oldboy~]# ls &>/dev/null; date &>/dev/null
[root@oldboy ~]# (ls; date) &>/dev/null
#后台执行
[root@oldboy ~]# (while ; do date; sleep 2; done) &
[1] 6378
[root@oldboy~]# (while ; do date; sleep 2; done) &>date.txt &
三、进程管道技术
1.管道的含义
管道操作符号 "|" ,主要用来连接左右两个命令, 将左侧的命令的标准输出, 交给右侧命令的标准输入, 无法传递标准错误输出至后者命令
- 管道的作用:管道命令符能让大家能进一步掌握命令之间的搭配使用方法,进一步提高命令输出值的处理效率。
示例图:

image
2.管道使用
1)例1: 将/etc/passwd 中的用户按 UID 大小排序
[root@oldboy~]# sort -t":" -k3 -n /etc/passwd
[root@oldboy ~]# sort -t":" -k3 -n /etc/passwd -r
[root@oldboy~]# sort -t":" -k3 -n /etc/passwd |head
2)例2: 统计当前/etc/passwd 中用户使用的 shell 类型
[root@oldboy ~]# awk -F: '{print $7}' /etc/passwd
[root@oldboy ~]# awk -F: '{print $7}' /etc/passwd |sort
[root@oldboy ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq
[root@oldboy ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq -c
4)例4: 打印当前所有 IP
[root@oldboy ~]# ifconfig|grep "inet "|awk '{print $2}'
10.0.0.200
127.0.0.1
5)例5: 打印根分区已用空间的百分比(仅打印数字)
[root@oldboy~]# df |grep '/$' |awk '{print $5}' |awk -F"%" '{print $1}'
6
3.管道中的tee技术
1)tee 的作用:将左边命令的标准输出保存至文件或打印至终端, 但不影 响管道数据的一个传递
示例图:

image
2)tee的使用
[root@oldboy ~]# ifconfig|grep "inet "|tee ip.txt|awk '{print $2}'
10.0.0.200
127.0.0.1
[root@oldboy ~]# cat ip.txt
inet 10.0.0.200 netmask 255.255.255.0 broadcast 10.0.0.255
inet 127.0.0.1 netmask 255.0.0.0
[root@oldboy ~]#
3)重定向与 tee 有他们在使用过程中有什么区别
1、直接将内容写入date.txt文件中
[root@oldboy ~]# date > date.txt
2、命令执行会输出至屏幕,但会同时保存一份至date.txt文件中
[root@oldboy ~]# date |tee date.txt
3)xargs参数传递,主要让一些不支持管道的命令可以使用管道技术
[root@oldboy ~]# which cat|xargs ls- l
[root@oldboy ~]# ls |xargs rm -fv
总结
今天我们主要学了标准输入输出的重定向,重定向符号有哪些,不同的符号运用在什么地方,怎样么样运用这些重定向的符号;学习了管道技术,主要用来多命令的结合使用,输出我们想要的结果,管道的应用无处不在,减缩命令的使用,很好用,在管道技术中有个tee的运用,他的功能可以理解为在运用管道技术时将我们想保留的中间文件保存到文件中。方便我们查看。