输入输出


重定向

定义

将原本要输出在终端(屏幕)上的内容,输出到指定的设备或文件中

为什么要使用重定向

重定向应用场景:
1.当屏幕输出的信息很重要,而且希望保存重要的信息时。
2.后台执行中的程序,不希望他干扰屏幕正常的输出结果时。
3.系统的例行命令, 例如定时任务的执行结果,希望他可以存下来时。
4.一些执行命令,我们已经知道他可能出现错误信息, 想将他直接丢弃时。
5.执行一个命令,可能报错和正确的输出并存,类似错误日志与标准正确日志需要分别输出至不同的文
件。

标准输入输出

标准输入0:stdin
标准输出1:stdout
错误输出2:stderr
[root@localhost ~]# ll /dev/std*
lrwxrwxrwx. 1 root root 15 Apr 16 15:52 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 Apr 16 15:52 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 Apr 16 15:52 /dev/stdout -> /proc/self/fd/1

## 文件描述符fd:一个命令或者程序在执行过程中,至少要打开4个文件描述符 
任务管理器  ps -ef
fd 文件位置 /proc/PID号/fd/
[root@moban fd]# pwd 0 
/proc/65507/fd
[root@moban fd]# ll
total 0
lrwx------. 1 root root 64 Apr 16 14:48 0 -> /dev/pts/0
lrwx------. 1 root root 64 Apr 16 14:48 1 -> /dev/pts/0
lrwx------. 1 root root 64 Apr 16 14:48 2 -> /dev/pts/0
lrwx------. 1 root root 64 Apr 16 14:51 255 -> /dev/pts/0

输入输出 符号 作用
标准输入重定向 < 0< 将标准输入到左边
标准输出重定向 > 1> >> 将标准输入到右边 (可以追加)
错误输出重定向 2> 2>> 将错误输入到右边 (可以追加)

image-20240416150110073


输出重定向

类型(重定向) 操作符 用途
标准输出覆盖 > 或者 1> 将命令的执行结果输出到指定文件中,不输出屏幕,会覆盖原文件
标准输出追加 >> 或者1 >> 将命令执行的结果追加输出到指定文件
错误输出覆盖 2> 将命令执行的报错信息重定向到指定的文件中,会覆盖文件原有内
错误输出追加 2>> 将命令执行的报错信息重定向追加到指定的文件中

标准输出覆盖重定向

image-20240416150647377

[root@moban ~]# echo 611 >> 416.txt
[root@moban ~]# cat 416.txt 
611

标准输出追加重定向

image-20240416150827837

[root@moban ~]# cat 416.txt 
611
[root@moban ~]# echo 425 >> 416.txt 
[root@moban ~]# cat 416.txt 
611
425

错误输出覆盖重定向

image-20240416150951239

[root@moban ~]# cat 416.txt 
611
425
[root@moban ~]# xxxxxx  2> 416.txt 
[root@moban ~]# cat 416.txt 
-bash: xxxxxx: command not found

错误输出和正确输出,都输出到同一个文件中

no-1

image-20240416151105039

## 方法一
[root@moban ~]# (ll;xxxxx) > 416.txt  2>416.txt     ------ 直接分两个写
[root@moban ~]# cat 416.txt 
-bash: xxxxx: command not found
     0 Apr 15 11:57 111
-rw-r--r--. 1 root root    12 Apr 16 11:28 2.cc
d---------. 2 root root     6 Apr 15 08:36 415.2024
-rw-r--r--. 1 root root     0 Apr 16 15:13 416.txt
-rw-r--r--. 1 root root    32 Apr 16 15:12 461.txt
-rw-r--r--. 1 root root     0 Apr 15 08:36 654
## 方法二
[root@moban ~]# (ls;xxxxx) > 416.txt  2>&1        -------  错误输出和标准输出一样
[root@moban ~]# cat 416.txt 
111
2.cc
415.2024
416.txt
461.txt
654
-bash: xxxxx: command not found
## 方法三
[root@moban ~]# (ll -a;xxxxx) &>416.txt         -------&  全部都写入   
[root@moban ~]# cat 416.txt 
total 84
dr-xr-x---.  3 root root  4096 Apr 16 15:12 .
dr-xr-xr-x. 17 root root   224 Mar 25 22:24 ..
-rw-r--r--.  1 root root    12 Apr 16 11:28 2.cc
d---------.  2 root root     6 Apr 15 08:36 415.2024
-rw-r--r--.  1 root root     0 Apr 16 15:16 416.txt
-rw-r--r--.  1 root root     0 Apr 15 08:36 654
-rwxrwxrwx.  1 root root     0 Apr 15 15:35 6.ttt
-rw-r--r--.  1 root root  3708 Apr 16 09:15 baidu.txt
-rw-------.  1 root root 12126 Apr 16 12:49 .bash_history
-rw-r--r--.  1 root root    18 Dec 29  2013 .bash_logout
-rw-r--r--.  1 root root   176 Dec 29  2013 .bash_profile
-rw-r--r--.  1 root root   176 Dec 29  2013 .bashrc
-rw-r--r--.  1 root root   100 Dec 29  2013 .cshrc
-rw-r--r--.  1 root root   246 Mar 28 01:19 host.sh
-rw-r--r--.  1 root root   129 Dec 29  2013 .tcshrc
-rw-------.  1 root root   537 Apr 15 17:39 .viminfo
-bash: xxxxx: command not found

将命令结果重定向到/dev/null(黑洞)

image-20240416151959178

[zls@localhost ~]$ find /etc/ -type d 1> /tmp/6.log 2>/dev/null
[zls@localhost ~]$ find /etc/ -type d &>/dev/null

标准输出重定向

[root@moban ~]# cat <<EOF >611.txt             cat接受的标准输入  保存覆盖到611.txt
> 一只蚂蚁钻洞口
> 看见一粒豆
> 怎么搬也搬不动
> 气的直摇头
> EOF
[root@moban ~]# cat 611.txt 
一只蚂蚁钻洞口
看见一粒豆
怎么搬也搬不动
气的直摇头

两条命令同时重定向

[root@localhost ~]# (ls;ifconfig) > /tmp/1.txt
## 将内容输出到文件,然后放后台执行
[root@localhost ~]# ping baidu.com &>/tmp/a.log &  ------- &放在后台执行的意思


## 拓展   subshell
[root@moban ~]# (cd /tmp;ls)       --------- 相当于新开了一个bash执行
6.66     access.log  pass.txt  passwd.txt
666.666  err.log     passwd    vmware-root_527-4290035496
[root@moban ~]# pwd
/root
#如果不希望某些命令的执行对当前 shell 环境产生影响,请在subshell中执行

管道技术

什么是管道符
管道符作用:将管道符左边命令的标准输出交给管道符右边命令的标准输入来处理
1)左边命令他得是标准输出 1>
2)右边命令必须有标准输入

image-20240416152957029

案例打印当前所有 IP

[root@moban ~]# ip a|grep -w 'inet'|awk '{print $2}'|cut -d '/' -f1
127.0.0.1
10.0.0.7

打印根分区已用空间的百分比(仅打印数字)

##  硬盘查询    df
[root@moban ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        980M     0  980M   0% /dev
tmpfs           991M     0  991M   0% /dev/shm
tmpfs           991M  9.5M  981M   1% /run
tmpfs           991M     0  991M   0% /sys/fs/cgroup
/dev/sda3       8.6G  1.6G  7.0G  18% /
/dev/sda1       497M  125M  373M  25% /boot
tmpfs           199M     0  199M   0% /run/user/0

[root@moban ~]# df -h|awk -F '[ %]+' '/sda3/{print $5}'
18

### tee管道技术

image-20240416154056754

[root@localhost ~]# echo $RANDOM|tee /dev/pts/3|passwd --stdin zls
[root@localhost ~]# echo $RANDOM|tee /tmp/pass.txt|passwd --stdin zls


## -a:append 追加到文件中
[root@localhost ~]# echo $RANDOM|tee -a /tmp/pass.txt|passwd --stdin zls

参数传递xargs

xargs将管道符前面命令的标准输出,当成结果,放到管道符右边xargs后面的命令的后面执行
[root@moban ~]# echo {1..10}|xargs -n1
1
2
3
4
5
6
7
8
9
10

 
进行拷贝命令     执行的默认放在后面
[root@moban ~]# grep -rl 'x' 
.bash_profile
.bash_history
.viminfo
6.xxx
[root@moban ~]# grep -rl 'x' |xargs cp -t /tmp/ 
[root@moban ~]# ll -a /tmp 
total 504
drwxrwxrwt.  8 root root   4096 Apr 16 15:49 .
dr-xr-xr-x. 17 root root    224 Mar 25 22:24 ..
--w-------.  1 root root     10 Apr 12 10:51 6.66
-rwxr-xr-x.  1 root root      0 Apr 12 10:37 666.666
-rw-r--r--.  1 root root      5 Apr 16 15:49 6.xxx
-rw-rw-r--.  1 test test 426145 Apr 11 16:40 access.log
-rw-------.  1 root root  12126 Apr 16 15:49 .bash_history
-rw-r--r--.  1 root root    176 Apr 16 15:49 .bash_profile
-rw-rw-r--.  1 test test  38282 Apr 11 16:40 err.log
drwxrwxrwt.  2 root root      6 Mar 25 22:22 .font-unix
drwxrwxrwt.  2 root root      6 Mar 25 22:22 .ICE-unix
-rw-r--r--.  1 root root    107 Apr 11 17:30 pass.txt
-rw-r-xr-x.  1 root root      9 Apr 12 09:58 passwd
-rw-rwxrwx.  1 root root    331 Apr 12 10:05 passwd.txt
drwxrwxrwt.  2 root root      6 Mar 25 22:22 .Test-unix
-rw-------.  1 root root    537 Apr 16 15:49 .viminfo
drwx------.  2 root root      6 Apr 12 08:29 vmware-root_527-4290035496
drwxrwxrwt.  2 root root      6 Mar 25 22:22 .X11-unix
drwxrwxrwt.  2 root root      6 Mar 25 22:22 .XIM-unix

# 使用 -I  把东西放在{}内
[root@moban ~]# echo {1..5}|xargs -I {}  echo “第{}个”
“第1 2 3 4 5个”
1.在管道后面的命令,都不应该在写文件名
2.在管道中只有标准输出才可以传递下一个命令, 标准错误输出会直接输出终端显示, 建议在使用管
道前将标准错误输出重定向。
例如: find /etc -name "*.conf" 2>/dev/null | grep rc
3.有些命令不支持管道技术, 但是可以通过 xargs 来实现管道传递。
例如: which cat|xargs ls-l
例如: ls |xargs rm -rvf
例如: ls |xargs cp -rvft /tmp/ -> ls | xargs -I {} cp -rvf {} /tmp
例如: ls |xargs mv -t /tmp/ -> ls | xargs -I {} mv {} /tmp