linux重定向
目录
Linux输入输出
1.重定向概述
1.什么是重定向?
将原本输出到屏幕的数据信息,重新定向到某个指定的文件中,或者定向到黑洞中[/dev/null].
比如:每天凌晨定时备份的数据,希望将备份数据的结果保存到某个文件中,第二天通过查看文件的内容就知道昨天备份的数据是成功还是失败.
重定向的作用:
将原本要输出到
1 ---> /dev/pts/0 (某一个终端)
2 ---> /dev/pts/0
重新定向到某个文件
1 > /var/log/stdin.log 标准输出
2 > /var/log/stderr.log 错误输出
#1.输出设备(链接指向)
[root@oldboy ~]# ll /dev/std*
lrwxrwxrwx. 1 root root 15 11月 13 23:03 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 11月 13 23:03 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 11月 13 23:03 /dev/stdout -> /proc/self/fd/1
[root@oldboy ~]# ll /proc/26885/fd
lrwx------. 1 root root 64 3月 18 09:11 0 -> /dev/pts/0
lrwx------. 1 root root 64 3月 18 09:11 1 -> /dev/pts/0
lrwx------. 1 root root 64 3月 18 09:10 2 -> /dev/pts/0
lr-x------. 1 root root 64 3月 18 09:11 3 -> /etc/passwd
lr-x------. 1 root root 64 3月 18 09:11 4 -> anon_inode:inotify
[root@oldboy ~]# tty
/dev/pts/1
2.为什么要使用重定向?
1.当屏幕输出的信息很重要,而且希望保存重要的信息时;
2.后台执行中的程序,不希望他干扰屏幕正常的输出结果时;
3.系统的例行命令,例如定时任务的执行结果,希望可以存下来时;
4.一些执行命令,我们已经知道他可能出现错误信息,想将他直接丢弃时;
5.错误日志与正确日志需要分别输出至不同的文件保存时;
3.学习重定向前需要了解的标准输入、标准输出、错误输出?
当运行一个程序时通常会自动打开三个标准文件,分别是标准输入、标准输出、错误输出
标准输入:键盘,输入的内容,或者是通过其他方式读入的内容
标准输出:当执行命令,返回的正确结果
错误输出:当执行命令,返回的错误结果
| 名称 | 文件描述符 | 作用 |
|---|---|---|
| 标准输入(STDIN) | 0 | 默认是键盘,也可以是文件或其他命令的输出。 |
| 标准输出(STDOUT) | 1 | 默认输出到屏幕。 |
| 错误输出(STDERR) | 2 | 默认输出到屏幕。 |
| 文件名称(filename) | 3+.... |
进程将从标准输入中得到数据,将正常输出打印至屏幕终端,将错误的输出信息也打印至屏幕终端。
PS: 进程是使用文件描述符(file descriptors)来管理打开的文件

重定向的作用:
将原本要输出到
1 ---> /dev/pts/0 (某一个终端)
2 ---> /dev/pts/0
重新定向到某个文件
1 > /var/log/stdin.log 标准输出
2 > /var/log/stderr.log 错误输出
2.输出重定向
输出重定向,改变输出内容的位置。输出重定向有如下几种方式,如表格所示
| 类型 | 操作符 | 用途 |
|---|---|---|
| 标准覆盖输出重定向 | > | 将程序输出的正确结果输出到指定的文件中,会覆盖文件原有的内容 |
| 标准追加输出重定向 | >> | 将程序输出的正确结果以追加的方式输出到指定文件,不会覆盖原有文件 |
| 错误覆盖输出重定向 | 2> | 将程序的错误结果输出到执行的文件中,会覆盖文件原有的内容 |
| 错误追加输出重定向 | 2>> | 将程序输出的错误结果以追加的方式输出到指定文件,不会覆盖原有文件 |
| 标准输入重定向 | << | 将命令中接收输入的途径由默认的键盘更改为指定的文件或命令 |
1.重定向、追加重定向、案例演示
案例1: 标准输出重定向(每次都会覆盖文件)
#标准输出重定向, 先清空,后写入, 如果文件不存在则创建
[root@VM-111-54-centos ~]# ifconfig eth1 > abc
案例2: 标准输出重定向(会往文件的尾部在添加内容)
[root@VM-111-54-centos ~]# echo "123" >>a
[root@VM-111-54-centos ~]# echo "123" >>a
[root@VM-111-54-centos ~]# cat a
123
123
案例3: 错误输出重定向
登录普通用户使用find查找etc目录下文件,没有权限的会报"ermission denied"表示错误输出,可以将错误输出重定向到一个文件中
[root@VM-111-54-centos ~]# su - kk
[kk@VM-111-54-centos ~]$ find /etc/ 2> a
[kk@VM-111-54-centos ~]$ cat a
find: '/etc/audisp': Permission denied
案例4: 将错误输出和正确输出定位到不同文件
# 1可以省略不写
[kk@VM-111-54-centos ~]$ find /etc >ok.txt 2>err.txt
将两个文件的内容输出到同一个文件
[kk@VM-111-54-centos ~]$ cat ok.txt err.txt > all.txt
案例5: 正确和错误都输入到相同位置 [混合输出到一个文件]
方式一:
[kk@VM-111-54-centos ~]$ find /etc >all.txt 2>all.txt
方法二:
&表示所有
1> 2> all.txt = &>all.txt
[kk@VM-111-54-centos ~]$ find /etc &>all.txt #一般这样写
方法三:
将错误输出重定向到1中进行输出
[kk@VM-111-54-centos ~]$ find /etc >all.txt 2>&1
案例6: 重定向到空设备/dev/null
将正确输出重定向到屏幕中,将错误输出丢到/dev/null
[kk@VM-111-54-centos ~]$ find /etc/ 2>/dev/null
将正确信息报错到ok.txt文件中,将错误信息输出到黑洞中
[kk@VM-111-54-centos ~]$ find /etc >ok.txt 2>/dev/null
将所有信息都重定向到黑洞设备中
[kk@VM-111-54-centos ~]$ find /etc &>/dev/null
案例7: 脚本中使用重定向 (了解即可)
[root@VM-111-54-centos ~]# vim ping.sh
ping -c1 baidu.com &>/dev/null
if [ $? -eq 0 ];then
echo "baidu.com is up." >>up.txt
else
echo "baidu.com is down." >>down.txt
fi
[root@VM-111-54-centos ~]# chmod +x ping.sh
[root@VM-111-54-centos ~]# ./ping.sh
2.总结
请解释如下重定向含义:
> 标准正确输出 ( 覆盖 )
>> 标准正确输出 ( 追加 )
&> 混合输出(标准输出、标准错误输出) ( 覆盖 )
&>> 混合输出(标准输出、标准错误输出) ( 追加 )
2> 标准错误输出 ( 覆盖 )
2>> 标准错误输出 ( 追加 )
1> te.txt 2>&1 错误->标准输出->te.txt ( 覆盖,标准输出是覆盖的 )
1>>te.txt 2>&1 错误->标准输出->>te.txt ( 追加,标准输出是追加的 )
3.输入重定向
输入重定向,即原本从键盘等上获得的输入信息,重定向由命令的输出作为输入。< 等价 0<
案例1: 从文件中读入输入的操作
[root@VM-111-54-centos /boot]# mail -s "test01" kk < /etc/hosts
[root@VM-111-54-centos ~]# grep 'root' < /etc/passwd
[root@VM-111-54-centos ~]# dd if=/dev/zero of=/file1.txt bs=1M count=20
[root@VM-111-54-centos ~]# dd </dev/zero >/file2.txt bs=1M count=20
案例2:mysql如何恢复备份
[root@VM-111-54-centos ~]# mysql -uroot -p123 < bbs.sql
案例3: 利用重定向建立多行数据的文件
#手动执行 shell 命令
[root@ ~]# echo "111" > file1.txt
[root@ ~]# cat file1.txt
111
[root@ ~]# cat >file2.txt
111
222
333
^D
[root@ ~]# cat >>file3.txt
aaa
bbb
ccc
^D
4.进程管道技术是什么?
管道操作符号 "|" ,主要用来连接左右两个命令, 将左侧的命令的标准输出, 交给右侧命令的标准输
PS: 无法传递标准错误输出至后者命令
案例1: 将/etc/passwd 中的用户按 UID 大小排序
1.拿到文件中的UID awk
2.借助sort排序
[root@VM-111-54-centos ~]# awk -F ':' '{print $3}' /etc/passwd |sort -r
案例2: 统计当前/etc/passwd 中用户使用的 shell 类型
1.拿到文件中的Shell类型那一列 AWK
2.对文件排序、去重、统计 sort uniq
[root@VM-111-54-centos ~]# awk -F ':' '{print $7}' /etc/passwd |sort |uniq -c |sort -nr
案例3: 打印当前所有 IP
[root@VM-111-54-centos ~]# ip addr |grep 'inet ' |awk '{print $2}' |awk -F"/" '{print $1}'
案例4: 打印根分区已用空间的百分比(仅打印数字)
1.打印磁盘容量 df -h
2.提取根分区容量哪一行 grep、awk
3.提取可用空间的百分比-列 awk
4.最后进行数据的处理 awk、sed
[root@VM-111-54-centos ~]# df -h |grep "/$" |awk '{print $5}' | awk -F '%' '{print $1}'
[root@VM-111-54-centos ~]# df -h |grep "/$" |awk '{print $5}' |sed 's#%##g'
[root@VM-111-54-centos ~]# df -h |grep "/$" |awk -F '[ %]+' '{print $5}'
1. tee
tee将管道执行的结果保存一份并向后传递
#选项: -a追加
tee和重定向的区别?
[root@xuliangwei ~]# date > 1.txt #将date命令的输出结果写入到1.txt中
[root@xuliangwei ~]# date | tee 1.txt #命令执行会输出至屏幕,但会同时保存一份至1.txt文件中
2.xargs
xargs参数传递,主要让一些不支持管道的命令可以使用管道技术
# which cat|xargs ls- l
# ls |xargs rm -fv
浙公网安备 33010602011771号