Day-13重定向

什么是重定向

将原本要输出到屏幕上的数据信息,重新定向到某个指定的文件中

重定向的作用

1.当屏幕输出的信息很重要而且希望保存重要信息时;
2.后台执行中的程序,不希望他干扰屏幕正常的输出结果时;
3.系统的例行命令,例如定时任务的执行结果,希望可以存下来时;
4.一些执行命令,我们知道 它可能出现错误信息,想将它直接丢弃时;
5.错误日志需要与正确日志分别输出至不同文件保存时

标准输入输出

image.png

进程将从标准输入中得到数据,将正常输出打印至屏幕终端,将错误输出也打至屏幕终端
进程是使用文件描述(file descriptors)来管理打开的文件
以cat为例,cat命令是从文件中读取数据,并将这些数据送到标准输出,但是我们使用cat没有跟上文件名,那么cat命令则就通过命令行标准输入中读取数据,并将其送到标准输出

[root@oldboy ~]# cat 1.1
cat<

标准输入输出的过程

持续追踪查看文件内容
[root@oldboy ~]# tail -f /etc/passwd
^Z
[1]+  Stopped                 tail -f /etc/passwd
查看运行的进程
[root@oldboy ~]# ps
   PID TTY          TIME CMD
  8595 pts/1    00:00:00 bash
  8647 pts/1    00:00:00 tail
  8649 pts/1    00:00:00 ps
查看tail命令的pid,8647进程下的文件描述符
[root@oldboy ~]# ls -l /proc/8647/fd
total 0
lrwx------. 1 root root 64 Aug  9 15:30 0 -> /dev/pts/1
lrwx------. 1 root root 64 Aug  9 15:30 1 -> /dev/pts/1
lrwx------. 1 root root 64 Aug  9 15:28 2 -> /dev/pts/1
lr-x------. 1 root root 64 Aug  9 15:30 3 -> /etc/passwd
lr-x------. 1 root root 64 Aug  9 15:30 4 -> anon_inode:inotify
查看标准输入输出设备
[root@oldboy ~]# ls -l /dev/std*
lrwxrwxrwx. 1 root root 15 Aug  9 08:10 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 Aug  9 08:10 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 Aug  9 08:10 /dev/stdout -> /proc/self/fd/1

输出重定向

输出重定向,改变输出内容的位置。如图所示!


image.png
正确输出,错误输出重定向至一个文件
cat 1.1 hhbb >2.2 2>2.2
[root@oldboy ~]# cat 1.1 hhbb &>2.2
[root@oldboy ~]# find /etc/ -name >ab 2>&1
将两个文件内容放在一起查看
[root@oldboy ~]# cat 1.1 1.2 >1.3
将标准输出与错误输出重定向至不同文件
[root@oldboy ~]# find /etc/ -name >a 2>b
将产生的数据放入黑洞设备,视为丢弃
[root@oldboy ~]# ls /root /evvm >1 &>/dev/null 
[root@oldboy ~]# ls /root /evvm >1 2>/dev/null 
脚本中的重定向
[root@oldboy ~]# vim ping.sh
ping 10.0.0.100 -c 1 -W 1 &>/dev/null

if [ $? -eq  0 ];then
    echo "10.0.0.100 up" >> up.txt
else
    echo "10.0.0.100 down" >> down.txt
fi
[root@oldboy ~]# ./ping.sh

输入重定向

输入重定向,即原本从键盘等上获得的输入信息,重定向由命令的属出作为输入。<或0>

[root@oldboy ~]# grep "root"
hcbv
vdv
t^H^H
root
root
[root@oldboy ~]# grep "root" < /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@oldboy ~]# dd if=/dev/zero of=/file1.txt bs=1M count=20
[root@oldboy ~]# dd /file2.txt bs=1M count=20
vim中的使用
[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
两条命令同时使用重定向
[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 &
[root@oldboy ~]# jobs
[1]+ 运行中 ( while :; do date; sleep 2;
done ) &>/date.txt &

进程管道技术

什么是管道
管道操作符号 "|" ,主要用来连接左右两个命令, 将左侧的命令的标准输出, 交给右侧命令的标准输入
PS: 无法传递标准错误输出至后者命令

[root@oldboy ~]# sort -t":" -k3 -n /etc/passwd |head
[root@oldboy ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq -c
[root@oldboy ~]# ss -an |grep :80 |awk -F":" '{print $8}' |sort |uniq -c |sort -k1 -rn |head -n 20
tee技术
a追加
[root@oldboy ~]# ip addr |grep 'inet ' |tee ip.txt |awk -F"/" '{print $1}' |awk '{print $2}'
127.0.0.1
10.0.0.100
[root@oldboy ~]# cat ip.txt
inet 127.0.0.1/8 scope host lo
inet 10.0.0.100/24 brd 192.168.69.255 scope global ens32
重定向与 tee 有他们在使用过程中有什么区别
[root@oldboy ~]# date > date.txt    直接将内容写入date.txt文件中
[root@oldboy ~]# date |tee date.txt 命令执行会输出至屏幕,但会同时保存一份至date.txt文件中
xargs参数传递,主要让一些不支持管道的命令可以使用管道技术
ls |xargs cp -rvt /tmp/ -或-> ls | xargs -I {} cp -rv {} /tmp/
ls |xargs mv -t /tmp/   -或-> ls | xargs -I {}  mv {} /tmp

你可能感兴趣的:(Day-13重定向)