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)来管理打开的文件

img

重定向的作用:
	将原本要输出到
		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

posted @ 2022-04-13 00:27  小迷茫c  阅读(286)  评论(0)    收藏  举报