管理linux中的输入输出
1.输入输出相关的一些定义
(1)重定向
- 输入重定向
允许用户不通过键盘,而是从文件中得到输入数据;
一般输入设备是键盘,若想把文件作为输入数据,即为“输入重定向”;
输入重定向只需将所有想执行的命令打包写入一个文件中,执行此文件即可! - 输出重定向
将原本要输出到屏幕的数据信息写入指定的文件中;
当不想将显示在shell脚本内,使用重定向,将输出内容放在指定文件中;
同时,输出重定向可以将正确的输出和错误的输出分别放在不同的文件中。
(2)当运行一个shell时,通常会自动打开三个文件,分别是标准输入文件(stdin) 标准正确输出(stdout) 标准错误输出(stderr)
(3)字符设备:I/O传输过程中以字符为单位进行传输的设备(例如打印机和键盘) Linux中,字符设备(/dev/pts)是内存中开启的虚拟设备,并非真实存在。
2.重定向输出的一些符号
重定向会覆盖源文件的内容
系统的输出有两种结果:
stdout 命令顺利执行后产生的字符串 输出编号1
stderr 命令失败执行后产生的字符串 输出编号2
> | 重定向正确输出(将正确结果定向到指定的文件) |
---|---|
2> | 将错误结果定向到指定文件 |
&> | 将全部的结果定向到指定的文件 |
>file1 2>file2 | 将正确结果定向到file1,将错误结果定向到file2 |
2> /dev/null | 将错误的内容放在垃圾桶 |
>file | 清空file文件 |
实验解析:以下实验必须在普通用户模式下进行
知识扩展:
(1)注销当前用户
[student@workstation Desktop]$ gnome-session-quit --force
(2)find 命令用法
[student@workstation Desktop]$ ls
1.txt 2.txt 3.txt 4.txt 5.txt 6.txt a.text b.text c.text
[student@workstation Desktop]$ find *.txt
[student@workstation ~]$ find /home/student/Desktop/ -name *.txt
输出重定向
首先查找/etc/passwd文件
[student@workstation Desktop]$ find /etc/ -name passwd
将正确结果重定向到westos.out文件中,错误的结果在shell屏幕中显示
linux中错误输出产生的原因是由于权限的限制不能访问,因此会产生标准错误输出
[student@workstation Desktop]$ find /etc/ -name passwd > westos.out
将错误结果重定向到westos.out文件中,正确的结果在shell屏幕中显示
[student@workstation Desktop]$ find /etc/ -name passwd 2> westos.err
将所有的结果重定向到westos.all文件中,屏幕中将不再显示!
[student@workstation Desktop]$ find /etc/ -name passwd &> westos.all
将 westos.all文件清空
[student@workstation Desktop]$ > westos.all
图8
将正确的结果定向到westos.out文件中,将错误的结果定向到westos.err文件中
[student@workstation Desktop]$ find /etc/ -name passwd > westos.out 2> westos.err
将错误的结果放在垃圾桶,正确的结果在shell屏幕输出
[student@workstation Desktop]$ find /etc/ -name passwd 2> /dev/null
重定向会覆盖源文件的内容
[student@workstation Desktop]$ find /etc/ -name passwd 2> file
[student@workstation Desktop]$ echo jiayou > file
[student@workstation Desktop]$ cat file
jiayou
3.追加
重定向会覆盖源文件的内容,如向实现重定向并且不覆盖源文件内容,应当使用追加
常见的追加符号:
>> | 追加正确输出 |
---|---|
2>> | 追加错误输出 |
&>> | 追加所有输出 |
实验解析:
在jiafile文件内容末尾追加正确的输出结果
[student@workstation Desktop]$ find /etc/ -name passwd >> jiafile
在jiafile文件内容末尾追加错误的输出结果
[student@workstation Desktop]$ find /etc/ -name passwd >> jiafile
在jiafile文件内容末尾追加所有的输出结果
[student@workstation Desktop]$ find /etc/ -name passwd &>> jiafile
4.管道
管道的定义: 管道连接左右两个命令,将左侧命令的标准输出 交给 右侧的命令作为标准输入。
管道流程图15
管道把输出变成一条命令的的输入!
管道默认只看1正确的内容,错误2的内容被忽略
实验解析:
管道的引入:
以往查询文件的行数,首先需要建立此文件,随后使用命令进行文件内容行数的查看。但是,因为硬盘的读写速度慢,cpu的计算速度快,先建立文件再计算行数显然降低了系统的速度。于是引出了 管道 的概念,不用建立文件,将管道符左侧的输出 作为 管道符右侧的输入,直接计算文件内容的行数!
[student@workstation Desktop]$ ls /bin/ | wc -l
将file文件内容中的小写字母转化为大写字母
[root@workstation Desktop]# cat file | tr 'a-z' 'A-Z'
管道只识别正确的信息,只允许正确的信息通过
[student@workstation Desktop]$ find /etc/ -name passwd | wc -l
为了能让错误的信息也通过管道,采用2>&1命令
[student@workstation Desktop]$ find /etc/ -name passwd 2>&1 | wc -l
[student@workstation Desktop]$ find /etc/ -name passwd 2>&1 | cat
管道左侧的输出作为右侧的输入,但是左侧的输出内容内有被保留,如果需要保存输出的内容,需要保存一份在文件中
重定向和管道tee的区别:
- 重定向直接将内容写在文件中
- 执行管道左侧命令会输出至屏幕,但同时会保存一份在文件中
[student@workstation Desktop]$ find /etc/ -name passwd | tee file | wc -l
使用命令tee时,顺序不同,文件保存的内容不同。
[student@workstation Desktop]$ find /etc/ -name passwd |wc -l |tee jiafile
5.输入重定向
5.1 多行录入 <<
一般的输入设备是键盘,若允许从文件中得到输入数据,用到了“输入重定向”
知识拓展:
Linux中,passwd 命令用来更改使用者的密码
- 若使用普通用户登陆进行passwd命令令,会重置当前用户的密码
- 若是用root用户进行passwd命令,会重置root用户登陆密码。但是如运行passwd 普通用户 则修改的是此普通用户的登陆密码。
实验解析(实验使用root用户进行)
实验一:
step1:使用root用户运行passwd 命令
[root@workstation Desktop]# passwd
图23
每次运行passwd都会要求重新设置密码,太繁琐了
采用输入重定向的方式,将文件内容输送到一个命令中作为输入
step2:从文件中得到输入数据(解决每次输入密码的繁琐问题)
一般文件以.sh 后缀结尾
[root@workstation Desktop]# vim westos.sh
在westos.sh 中写入:通常以EOF为起始标识
passwd << EOF
redhat
redhat
EOF
date
step3:运行文件westos.sh
[root@workstation Desktop]# bash westos.sh
实验二:
step1:使用root用户运行passwd 命令
[root@workstation Desktop]# vim westos.sh
在westos.sh 中写入:通常以EOF为起始标识
将什么内容重定向到file文件中,这个什么内容就是输入,需要用到输入重定向符号 << 将后面的内容作出输入的内容送给前面的命令
cat > file << EOF
HELLO
WORLA
nihao
shijie
EOF
step2:运行文件westos.sh
[root@workstation Desktop]# bash westos.sh
step3:查看file文件中的内容
[root@workstation Desktop]# cat file
HELLO
WORLA
nihao
shijie
5.2 一次输入重定向 <
将文件的内容作为标准输入
[root@workstation Desktop]# wc -l < file
[root@workstation Desktop]# cat < file
题目练习
1.在屏幕显示出历史命令的3~5行
[root@workstation Desktop]# history | sed -n 3,5p
[root@workstation Desktop]# history | head -5 |tail -3