Linux系统管理-输入输出
重定向
什么是重定向
将原本要输出到屏幕的数据信息,重新定向到指定的文件中。
为什么要使用重定向
1.当屏幕输出的信息很重要,而且希望保存重要的信息时。
2.后台执行中的程序,不希望他干扰屏幕正常的输出结果时。
3.系统的执行命令, 例如定时任务的执行结果,希望他可以存下来时。
4.执行一些命令,我们已经知道他可能出现错误信息, 想将他直接丢弃时。
5.执行一个命令,可能报错和正确的输出并存,类似错误日志与标准正确日志需要分别输出至不同的文件。
输入和输出
**文件描述符:**每一个程序都会有自己的文件描述符,每个程序的文件描述符的数量都不一样,至少有3个。
名称 | 文件描述符 | 作用 |
---|---|---|
标准输入(stdin) | 0 | 通常是键盘,也可以是其他文件或者命令的输出的内容可以作为标准输入 |
标准输出(stdout) | 1 | 默认输出到屏幕 |
错误输出(stderr) | 2 | 默认输出到屏幕 |
文件名称(filename) | 3+ |
进程将从标准输入中得到数据,将正常输出打印至屏幕终端,将错误的输出信息也打印至屏幕终端。
进程使用文件描述符(file descriptors)
来管理打开的文件
输出重定向
类型 | 操作符 | 用途 |
---|---|---|
标准输出覆盖重定向 | 1>或者> | 将原本默认输出到屏幕上的内容标准输出到指定文件中并覆盖 |
标准输出追加重定向 | >>或者1>> | 将原本默认输出到屏幕上的内容追加到其它文件或设备的末尾 |
错误输出覆盖重定向 | 2> | 将程序的错误结果输出到执行的文件中,会覆盖原文件内容 |
错误输出追加重定向 | 2>> | 将程序输出的错误结果以追加的方式输出到指定文件中,不会覆盖原文件 |
标准输出和错误输出同时输出到文件中 | &> | 将程序所有文件描述符的输出内容重定向到指定文件中 |
标准输出和错误输出同时输出到文件中 | 2,3,4……>&1 | 将程序除1之外其它文件描述符的输出内容交给标准输出1,然后让标准输出1重定向到指定文件中 |
标准输出覆盖重定向
[root@oldboy /tmp]# ls /etc/passwd > /tmp/a.txt
[root@oldboy /tmp]# cat a.txt
/etc/passwd
标准输出追加重定向
[root@oldboy /tmp]# ls /etc/passwd >> /tmp/a.txt
[root@oldboy /tmp]# ls /etc/passwd >> /tmp/a.txt
[root@oldboy /tmp]# cat /tmp/a.txt
/etc/passwd
/etc/passwd
错输出覆盖重定向
[root@oldboy /tmp]# ls /etc/passsssss 2> /tmp/a.txt
[root@oldboy /tmp]# cat /tmp/a.txt
ls: cannot access /etc/passsssss: No such file or directory
错误输出追加重定向
[root@oldboy /tmp]# ls /etc/passsssss 2>> /tmp/a.txt
[root@oldboy /tmp]# cat /tmp/a.txt
ls: cannot access /etc/passsssss: No such file or directory
ls: cannot access /etc/passsssss: No such file or directory
标准输出和错误输出同时输出到文件中
[root@oldboy /tmp]# ls /etc/passwd /etc/passsss &> /tmp/a.txt
[root@oldboy /tmp]# cat /tmp/a.txt
ls: cannot access /etc/passsss: No such file or directory
/etc/passwd
[root@oldboy /tmp]# ls /etc/passwd /etc/passss > /tmp/a.txt 2>&1
[root@oldboy /tmp]# cat a.txt
ls: cannot access /etc/passss: No such file or directory
/etc/passwd
输入重定向
输入重定向,即原本从键盘等设备上获得的输入信息,重定向由命令的输出作为输入。
类型 | 操作符 | 用途 |
---|---|---|
标准输入重定向 | <或者0< | 原本从键盘等设备上获取的输入信息,重定向为由命令的输出为作为输入 |
标准输入追加重定向 | <<或者0<< | 目前只知道cat,原本从键盘等设备上获取的输入信息,追加重定向为由命令的输出作为输入 |
# 案例1
[root@oldboy /tmp]# grep '^root' < /etc/passwd
root:x:0:0:root:/root:/bin/bash
# 案例2
[root@oldboy /tmp]# dd </dev/zero>/tmp/disk.txt bs=1M count=2
[root@oldboy /tmp]# ll -h /tmp/disk.txt
-rw-r--r--. 1 root root 2.0M Jun 17 18:18 /tmp/disk.txt
管道符
什么是管道符
管道操作符号 | 连接左右两个命令,把管道符左边命令的标准输出交给管道符右边的标准输入来处理。
注意:错误输出无法处理
管道符的例子
# 案例1:按照/etc/passwd 中的UID大小倒序排序
[root@oldboy ~]# sort -t ':' -k 3 -nr /etc/passwd
user2:x:1011:1011::/home/user2:/bin/bash
user1:x:1010:1010::/home/user1:/bin/bash
# 案例2: 统计当前/etc/passwd 中用户使用的 shell 类型
[root@oldboy ~]# awk -F: '{print $7}' /etc/passwd|sort|uniq -c|sort -nr
14 /sbin/nologin
7 /bin/bash
1 /sbin/shutdown
1 /sbin/halt
1 /bin/sync
**注意:**管道符能让命令之间搭配使用,提高命令输出值的处理效率,但是尽可能的减少管道的数量,管道的数量越多效率越低。
tee 管道技术
# 创建5个用户,密码随机,并且记录到文件
seq 5|awk '{print "useradd user"$1";echo $RANDOM|md5sum|cut -c 1-10|tee -a /tmp/user.txt|passwd --stdin user"$1}'|bash
重定向与tee的区别
[root@oldboy ~]# date > /tmp/date.txt
[root@oldboy ~]# date |tee /tmp/date.txt
Fri Jun 18 15:20:38 CST 2021
区别:重定向只定向到指定文件中,tee不仅定向到指定文件中还在屏幕上显示。
xargs 传递参数
xargs的作用
将原本没有标准输入的命令,收到xargs的标准输入中,然后交给这些命令处理。
读入stdin的数据流转换为参数添加至命令后面
将参数列表转换成小块分段传递给其它命令
-I:将数据流保存到{}中,后面的命令可以直接调用{}
[root@oldboy ~]# echo '/root/file1'|xargs -I {} cp {} /tmp/
[root@oldboy ~]# echo '/root/file1'|xargs -I {} cp {} /tmp/oldboy/[root@oldboy ~]# ls /tmp/oldboy/
file1
[root@oldboy ~]# echo '/tmp/oldboy/'|xargs ls
file01 file02