重定向的概念
什么是重定向 #将原本要输出到屏幕的数据信息,重新定向到指定的文件中 #改变标准输入、标准输出的方向就是重定向
比如:每天凌晨定时备份数据,希望将备份数据的结果保存到某个文件中。这样第二天通过查看结果文件,就知道昨天备份数据是成功,还是失败。
为何要使用重定向 1.当屏幕输出的信息很重要,而且希望保存重要的信息时。 2.后台执行中的程序,不希望他干扰屏幕正常的输出结果时。 3.系统的例行命令, 例如定时任务的执行结果,希望他可以存下来时。 4.一些执行命令,我们已经知道他可能出现错误信息, 想将他直接丢弃时。 5.执行一个命令,可能报错和正确的输出并存,类似错误日志与标准正确日志需要分别输出至不同的文件。
输入和输出
# stdin
标准输入
# stdout
标准输出
命令返回值
# 如何判断上一条命令的执行是否成功
echo $?
返回值是0 就代表上一条命令执行成功
返回值如果不是0 就代表上一条命令不成功
标准输入和输出
执行一个shell
程序时通常会自动打开三个文件描述符
名称 |
文件描述 |
作用 |
stdin |
0 |
标准输入(通常是键盘,也可以是其他文件或者命令的输出的内容可以作为标准输入) |
stdout |
1 |
标准输出(默认输出到屏幕) |
stderr |
2 |
错误输出(默认输出到屏幕) |
文件名 |
3+ |
把标准输出放入黑洞,1是标准输出的文件描述(用1代表标准输出结果,把标准输出放到黑洞)
[root@web03 ~]# cat 1.txt
abcd
[root@web03 ~]# echo $?
0
[root@web03 ~]# cat 1.txt 1>/dev/null
进程将从标准输入中得到数据,将正常输出打印至屏幕终端,将错误的输出信息也打印至屏幕终端。 进程使用文件描述符(file descriptors)来管理打开的文件
以cat命令为例, cat命令的功能是从命令行给出的文件中读取数据,并将这些数据直接送到标准输出。
若使用如下命令:
#会把文件`/etc/passwd`的内容依次显示到屏幕上
[root@web03 ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
但如果cat命令行中没有参数, 它就会从标准输入中读取数据, 并将其送到标准输出。
[root@web03 ~]# cat
www
www
^C
//用户输入的每一行都立刻被cat命令输出到屏幕上。
输入输出过程检测
#持续追踪查看文件内容(tail -f)
[root@web03 ~]# tail -f /etc/passwd
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
^Z
[1]+ Stopped tail -f /etc/passwd
#查看运行的进程
[root@web03 ~]# ps
PID TTY TIME CMD
6966 pts/0 00:00:00 bash
7588 pts/0 00:00:00 tail
7629 pts/0 00:00:00 ps
# Linux查看标准输入输出设备
[root@web03 ~]# ll /dev/std*
lrwxrwxrwx 1 root root 15 Aug 14 15:54 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Aug 14 15:54 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Aug 14 15:54 /dev/stdout -> /proc/self/fd/1
输出重定向
类型 |
操作符 |
用途 |
标准覆盖输出重定向 |
1> |
将命令执行结果输出到指定的文件中,而不是直接显示到屏幕上 |
标准追加重定向 |
>> |
将命令的执行结果追加输出到指定文件 |
错误覆盖输出重定向 |
2> |
将程序的错误结果输出到执行的文件中,会覆盖源文件内容 |
错误追加输出重 定向 |
2>> |
将程序输出的错误结果以追加的方式输出到指定文件中,不会覆盖原文件 |
标准输入重定向 |
<< |
将命令中接收输入的途径由默认的键盘更改为指定的文件 |
标准输出重定向(覆盖)
# 覆盖重定向
[root@web03 ~]# cat 1.txt
abcd
[root@web03 ~]# echo efg > 1.txt
[root@web03 ~]# cat 1.txt
efg
标准输出重定向(追加)
[root@web03 ~]# cat 1.txt
efg
[root@web03 ~]# echo hell word >> 1.txt
[root@web03 ~]# cat 1.txt
efg
hell word
错误输出重定向
ll /asdasdasd 2> 1.txt
正确和错误都输出到相同位置
- 输出到同一个文件
# & 将正确输出和错误输出都定向到了一个文件
[root@web03 ~]# find / -name "*.conf" &>ab
[root@web03 ~]# cat ab
find: ‘/-name’: No such file or directory
find: ‘*.conf’: No such file or directory
- 输出到不同文件,再合并
# 将标准输出和标准错误输出重定向到不同文件
[root@web03 ~]# find /etc -name "*.conf" 1>a 2>b
#合并两个文件内容至一个文件
[root@web03 ~]# cat a b > c
重定向到空设备
#空设备,即将产生的输出丢掉(/dev/null黑洞)
[root@web03 ~]# ls /root /error >ab 2>/dev/null
[root@web03 ~]# ls /root /error >ab &>/dev/null
输出重定向
# 从/dev/zero去数据放到/root/1.txt(/dev/zero白洞)
[root@web03 ~]# dd if=/dev/zero of=/root/1.txt bs=1M count=20
20+0 records in
20+0 records out
20971520 bytes (21 MB) copied, 0.164332 s, 128 MB/s
[root@web03 ~]# dd bs=1K count=1024 </dev/zero > /root/4.txt
1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB) copied, 0.00146606 s, 715 MB/s
管道技术
# 将/etc/passwd以uid排序并展示前10行
[root@pkq ~]# sort -t ':' -k3 -n /etc/passwd|head
# 统计/etc/passwd的所有shell类型
[root@pkq ~]# awk -F: '{print $NF}' /etc/passwd | sort | uniq -c
tee
# 分流到文件
ip addr |grep 'inet ' |tee ip.txt |awk -F"/" '{print $1}' |awk '{print $2}'
# 分流到终端
ip addr |grep 'inet ' |tee /dev/pts/0 |awk -F"/" '{print $1}' |awk '{print $2}'
参数传递xargs
将原本没有标准输入的命令,收到xargs的标准输入中,在传递给后面的命令处理
-I 将数据保存在{}之中, 后面的命令可以直接调用{}
find /root/ -name '*.sh' | xargs -I {} cp {} /opt/
-n 将前面的数据以列的形式排,指定数字是几,一行就有
几个
# 一行一列
[root@pkq ~]# ls |xargs -n1
10.txt
11.txt
# 一行两列
[root@pkq ~]# ls |xargs -n2
10.txt 11.txt
12.txt 13.txt
# 一行三列
[root@pkq ~]# ls |xargs -n3
10.txt 11.txt 12.txt
13.txt 14.txt 15.txt
-i
-I