一、重定向概述
1. 什么是重定向
将原本要输出到屏幕的数据信息,重新定向到某个指定的文件中,或者从一个重定向的位置读取信息。
2.为什么使用重定向
- 1.当屏幕输出的信息很重要,而且希望保存重要的信息时;
- 2.后台执行中的程序,不希望他干扰屏幕正常的输出结果时;
- 3.系统的例行命令, 例如定时任务的执行结果,希望可以存下来时;
- 4.一些执行命令,我们已经知道他可能出现错误信息, 想将他直接丢弃时;
- 5.错误日志与正确日志需要分别输出至不同的文件保存时;
3.重定向的基本知识
名称 | 文件描述符 | 作用 |
标准输入(STDIN) | 0 | 默认输入是键盘,也可以是文件或其他命令的输出 |
标准输出(STDOUT) | 1 | 默认输出到屏幕 |
错误输出(STDERR) | 2 | 默认输出到屏幕 |
下面是一些输入输出的过程
#输入与输出过程 [root@whb ~]# cat oldboy #标准输入,没有指定文件时,默认从键盘中读取数据 oldboy #标准输出,将你标准输入的结果进行标准输出到屏幕上面 #查看程序的进行过程中产生的一些文件 [root@whb ~]# tail -f /var/log/messages Dec 19 15:01:01 qls systemd: Created slice User Slice of root. Dec 19 15:01:01 qls systemd: Started Session 538 of user root. Dec 19 15:01:01 qls systemd: Removed slice User Slice of root. Dec 19 16:01:01 qls systemd: Created slice User Slice of root. Dec 19 16:01:01 qls systemd: Started Session 539 of user root. Dec 19 16:01:01 qls systemd: Removed slice User Slice of root. Dec 19 16:20:36 qls systemd: Created slice User Slice of yuwei. Dec 19 16:20:36 qls systemd: Started Session 540 of user yuwei. Dec 19 16:20:36 qls systemd-logind: New session 540 of user yuwei. Dec 19 16:20:42 qls su: (to root) yuwei on pts/0 ^Z [1]+ Stopped tail -f /var/log/messages
二、输出重定向
作用:将输出的结果重定向到一个指定的位置中(不管正确的信息或者错误的信息)
类型 | 符号 | 用途 |
标准覆盖输出重定向 | > | 将程序输出的正确结果输出到指定的文件中,会覆盖文件原有的内容 |
标准追加输出重定向 | >> | 将程序输出的正确结果以追加的方式输出到指定文件,不会覆盖原有文件 |
标准错误覆盖输出重定向 | 2> | 将程序的错误结果输出到执行的文件中,会覆盖文件原有的内容 |
标准错误追加输出重定向 | 2>> | 将程序输出的错误结果以追加的方式输出到指定文件,不会覆盖原有文件 |
演示案例:
实例1:标准输出重定向
[root@whb ~]# echo hello > file1.txt [root@whb ~]# cat file1.txt hello [root@whb ~]# cat file1.txt /etc/passwd > file2.txt [root@whb ~]# cat file2.txt hello root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin [root@whb ~]# cat >> file3.txt linux centos ^C [root@whb ~]# cat file3.txt linux centos
实例2:标准输出追加重定向
[root@whb ~]# echo 'test' >> file1.txt [root@whb ~]# cat file1.txt hello test
实例3:标准错误输出重定向
[root@whb ~]# ls /rttt > file5.txt ls: cannot access /rttt: No such file or directory [root@whb ~]# cat file5.txt [root@whb ~]# ls /rttt 2> file5.txt [root@whb ~]# cat file5.txt ls: cannot access /rttt: No such file or directory [root@whb ~]# ls /root 2> file5.txt file1.txt file2.txt file3.txt file4.txt file5.txt
实例4:标准错误输出追加重定向
[root@whb ~]# ls /rttt 2>> file5.txt [root@whb ~]# cat file5.txt ls: cannot access /rttt: No such file or directory ls: cannot access /rttt: No such file or directory [root@whb ~]# ls /rttt 2>> file5.txt [root@whb ~]# cat file5.txt ls: cannot access /rttt: No such file or directory ls: cannot access /rttt: No such file or directory ls: cannot access /rttt: No such file or directory [root@whb ~]# ls /root 2>> file5.txt file1.txt file2.txt file3.txt file4.txt file5.txt [root@whb ~]# cat file5.txt ls: cannot access /rttt: No such file or directory ls: cannot access /rttt: No such file or directory ls: cannot access /rttt: No such file or directory
实例5:将错误和正确的都重定向到一个文件中
[root@whb ~]# ll /ias > test.txt 2>&1 #比较原始的用法,与&>结果相同 [root@whb ~]# cat test.txt ls: cannot access /ias: No such file or directory [root@whb ~]# ll /iis &> test.txt [root@whb ~]# cat test.txt ls: cannot access /iis: No such file or directory [root@whb ~]# ll / -d &> test.txt [root@whb ~]# cat test.txt drwxr-xr-x. 22 root root 4096 Dec 19 15:50 / #也可以使用追加的方式把错误和正确的信息都输入在同一个文件中 [root@whb ~]# ls abc &>> test.txt [root@whb ~]# cat test.txt drwxr-xr-x. 22 root root 4096 Dec 19 15:50 / ls: cannot access abc: No such file or directory
案例6: 将输出的信息定向到空
[root@whb ~]# ls /root >/dev/null [root@whb ~]# cat /dev/null [root@whb ~]# ls /rtt 2>/dev/null
实例7: 将正确的输出信息和错误的输出信息重定向不同的文件中
[root@whb ~]# ls /opt/ >file7.txt 2>file8.txt [root@whb ~]# rm -rf /opt/ [root@whb ~]# ls /opt/ >file7.txt 2>file8.txt [root@whb ~]# cat file7.txt [root@whb ~]# cat file8.txt ls: cannot access /opt/: No such file or directory [root@whb ~]# ls /opt/ >>file7.txt 2>>file8.txt [root@whb ~]# rm -rf /opt/ [root@whb ~]# ls /opt/ >>file7.txt 2>>file8.txt [root@whb ~]# cat file7.txt services [root@whb ~]# cat file8.txt ls: cannot access /opt/: No such file or directory ls: cannot access /opt/: No such file or directory
实例8:多条命令的输出结果到文件中
[root@whb ~]# ls access.log catweb.log etc.zip httpd-2.4.41.tar.gz secure.log sort.log test test.txt [root@whb ~]# ls ; ls /mnt/ > file1.txt access.log catweb.log etc.zip httpd-2.4.41.tar.gz secure.log sort.log test test.txt [root@whb ~]# ls /mnt/ cdrom swapfile2 [root@whb ~]# cat file1.txt cdrom swapfile2
实例9:脚本中使用重定向
[root@whb ~]# cat test.sh #!/bin/bash ping -c1 www.baidu.com if [ $? -eq 0 ];then echo "网络是通畅的....." else echo "网络是不通的....." fi [root@whb ~]# ./test.sh PING www.a.shifen.com (180.101.49.12) 56(84) bytes of data. 64 bytes from 180.101.49.12 (180.101.49.12): icmp_seq=1 ttl=128 time=17.8 ms --- www.a.shifen.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 17.818/17.818/17.818/0.000 ms 网络是通畅的..... [root@whb ~]# cat test.sh #!/bin/bash ping -c1 www.baidu.com &>/dev/null if [ $? -eq 0 ];then echo "网络是通畅的....." else echo "网络是不通的....." fi [root@whb ~]# ./test.sh 网络是通畅的.....
三、输入重定向
作用:输入重定向,即原本从键盘等上获得的输入信息,重定向由命令的输出作为输入。< 等价 0<
标准输入重定向 | < | 将命令中接收输入的途径由默认的键盘更改为指定的文件或命令 |
标识符限定输入重定向 | << | 命令从标准输入中读入内容,直到遇到"标识符"分解符为止 |
演示案例:
[root@whb ~]# cat < file1.txt hello test file1.txt file2.txt file3.txt file4.txt [root@whb ~]# cat root root ^C [root@whb ~]# tr 'f' 'F' #交互式输入信息 file File ^C [root@whb ~]# tr 'f' 'F' < file1.txt hello test File1.txt File2.txt File3.txt File4.txt [root@whb ~]# grep 'root' < /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [root@whb ~]# grep 'root' #交互式输入信息,过滤内容 oldboy root root rootttt rootttt
实例2:数据库中导入库或者表,恢复数据
[root@whb ~]# mysql -uroot -p123 < database.sql
实例3:生成一个文件
[root@whb ~]# dd if=/dev/zero of=/root/test.log bs=10M count=100 100+0 records in 100+0 records out 1048576000 bytes (1.0 GB) copied, 27.5536 s, 38.1 MB/s [root@whb ~]# ll -h total 1001M -rw-r--r--. 1 root root 1000M Dec 19 18:27 test.log -rwxr-xr-x. 1 root root 143 Dec 19 17:38 test.sh [root@whb ~]# dd </dev/zero >/root/test.txt bs=10M count=10 10+0 records in 10+0 records out 104857600 bytes (105 MB) copied, 11.6617 s, 9.0 MB/s [root@whb ~]# ll -h total 1.1G -rw-r--r--. 1 root root 1000M Dec 19 18:27 test.log -rwxr-xr-x. 1 root root 143 Dec 19 17:38 test.sh -rw-r--r--. 1 root root 100M Dec 19 18:28 test.txt
这里用到了 dd 命令,这里简单介绍下用法和几个简单的选项
dd #用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。
使用方式:
dd [option]
dd [option]
if #从哪里读取数据
of #输出到哪里
bs #一次输出多少
count #输出的次数
[root@whb ~]# dd if=/dev/zero of=/root/test.log bs=10M count=100 100+0 records in 100+0 records out 1048576000 bytes (1.0 GB) copied, 27.5536 s, 38.1 MB/s [root@whb ~]# ll -h total 1001M -rw-r--r--. 1 root root 143 Dec 19 17:34 file10.txt -rw-r--r--. 1 root root 51 Dec 19 17:12 file1.txt -rw-r--r--. 1 root root 2.2K Dec 19 17:05 file2.txt -rw-r--r--. 1 root root 102 Dec 19 17:30 file8.txt -rw-r--r--. 1 root root 174 Dec 19 17:33 file9.txt -rw-r--r--. 1 root root 1000M Dec 19 18:27 test.log -rwxr-xr-x. 1 root root 143 Dec 19 17:38 test.sh [root@whb ~]# dd /root/test.txt bs=10M count=10 10+0 records in 10+0 records out 104857600 bytes (105 MB) copied, 11.6617 s, 9.0 MB/s [root@whb ~]# ll -h total 1.1G -rw-r--r--. 1 root root 143 Dec 19 17:34 file10.txt -rw-r--r--. 1 root root 51 Dec 19 17:12 file1.txt -rw-r--r--. 1 root root 2.2K Dec 19 17:05 file2.txt -rw-r--r--. 1 root root 174 Dec 19 17:33 file9.txt -rw-r--r--. 1 root root 1000M Dec 19 18:27 test.log -rwxr-xr-x. 1 root root 143 Dec 19 17:38 test.sh -rw-r--r--. 1 root root 100M Dec 19 18:28 test.txt
实例4:标准输入限定标识符重定向
[root@whb ~]# cat >new.txt<<EOF > oldboy > oldgirl > EOF [root@whb ~]# cat new.txt oldboy oldgirl
实例5:脚本中使用标准输入限定标识符重定向
脚本中打印菜单
[root@whb ~]# cat ./test.sh #!/bin/bash cat <<EOF 1.ping主机10.0.0.100 2.ping主机10.0.0.200 EOF ping -c1 www.baidu.com &> /dev/null if [ $? -eq 0 ];then echo "网络是通畅的....." else echo "网络是不通的....." fi
四、管道技术
作用:将左侧的命令的输出结果作为右侧命令的标准输入进行处理,不会把错误的信息传递过去
管道操作符号 "|"
使用格式 cmd1 | cmd2 | cmd3 ......
[root@whb ~]# cut -d ":" -f3 /etc/passwd | sort -rn 2022 2021 2020 2019 [root@whb ~]# cut -d ":" -f7 /etc/passwd | sort | uniq -c | sort -rn 28 /bin/bash 19 /sbin/nologin 1 /sbin/shutdown 1 /sbin/halt 1 /bin/sync [root@whb ~]# ip a s eth0 2: eth0: <broadcast,multicast,up,lower_up> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:ae:0b:8a brd ff:ff:ff:ff:ff:ff inet 10.0.0.100/24 brd 10.0.0.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet6 fe80::c653:602a:38c6:e45/64 scope link noprefixroute valid_lft forever preferred_lft forever [root@whb ~]# ip a s eth0 | grep -w inet inet 10.0.0.100/24 brd 10.0.0.255 scope global noprefixroute eth0 [root@whb ~]# ip a s eth0 | grep -w inet | cut -d " " -f6 10.0.0.100/24 [root@whb ~]# ip a s eth0 | grep -w inet | cut -d " " -f6 | cut -d "/" -f1 10.0.0.100</broadcast,multicast,up,lower_up>
管道技术中的tee技术
作用:将输出结果输出到屏幕的同时,也会输出到一个指定的文件中
-a #追加
[root@whb ~]# ip a s eth0 | grep -w inet | cut -d " " -f6 | cut -d "/" -f1 | tee ip.txt 10.0.0.100 [root@whb ~]# cat ip.txt 10.0.0.100 [root@whb ~]# ip a s eth0 | grep -w inet | cut -d " " -f6 | cut -d "/" -f1 > ip.txt [root@whb ~]# cat ip.txt 10.0.0.100 [root@whb ~]# echo $RANDOM|md5sum | cut -c 1-10 2139cee1fc [root@whb ~]# echo $RANDOM|md5sum | cut -c 1-10 |passwd --stdin user06 Changing password for user user06. passwd: all authentication tokens updated successfully. [root@whb ~]# echo $RANDOM|md5sum | cut -c 1-10 |tee pass.txt |passwd --stdin user06 Changing password for user user06. passwd: all authentication tokens updated successfully. [root@whb ~]# echo $RANDOM|md5sum | cut -c 1-10 |tee |passwd --stdin user06 Changing password for user user06. passwd: all authentication tokens updated successfully. [root@whb ~]# echo $RANDOM|md5sum | cut -c 1-10 |tee pass.txt c3d3da1a5e [root@whb ~]# echo $RANDOM|md5sum | cut -c 1-10 |tee -a pass.txt a026eeb93c [root@whb ~]# cat pass.txt c3d3da1a5e a026eeb93c
xargs
将一些不支持管道命令支持管道,默认管道是将左侧的输出结果标准输入到右侧的命令,主要是针对数据操作,xargs可以让这些数据交给右侧命令当做是针对文件操作。
.
实例:将当前目录下的所有.txt类型的文件复制到/opt目录下
方法一:通过xargs实现 [root@whb ~]# find ./ -name "*.txt" |xargs cp -t /opt [root@whb ~]# ll /opt total 40 -rw-r--r--. 1 root root 8 Dec 19 19:15 file10.txt -rw-r--r--. 1 root root 8 Dec 19 19:15 file1.txt -rw-r--r--. 1 root root 8 Dec 19 19:15 file2.txt -rw-r--r--. 1 root root 8 Dec 19 19:15 file3.txt -rw-r--r--. 1 root root 8 Dec 19 19:15 file4.txt -rw-r--r--. 1 root root 8 Dec 19 19:15 file5.txt -rw-r--r--. 1 root root 8 Dec 19 19:15 file6.txt -rw-r--r--. 1 root root 8 Dec 19 19:15 file7.txt -rw-r--r--. 1 root root 8 Dec 19 19:15 file8.txt -rw-r--r--. 1 root root 8 Dec 19 19:15 file9.txt 方法二:通过$()实现 [root@whb ~]# cp $(find ./ -name "*.txt") /opt/ [root@whb ~]# ll /opt/ total 40 -rw-r--r--. 1 root root 8 Dec 19 19:17 file10.txt -rw-r--r--. 1 root root 8 Dec 19 19:17 file1.txt -rw-r--r--. 1 root root 8 Dec 19 19:17 file2.txt -rw-r--r--. 1 root root 8 Dec 19 19:17 file3.txt -rw-r--r--. 1 root root 8 Dec 19 19:17 file4.txt -rw-r--r--. 1 root root 8 Dec 19 19:17 file5.txt -rw-r--r--. 1 root root 8 Dec 19 19:17 file6.txt -rw-r--r--. 1 root root 8 Dec 19 19:17 file7.txt -rw-r--r--. 1 root root 8 Dec 19 19:17 file8.txt -rw-r--r--. 1 root root 8 Dec 19 19:17 file9.txt