I/O重定向

I/O对应系统中的输入(input)和输出(output)

其中输入可以是键盘输入,鼠标输入等等。同样输出也可以输出到终端中或者文件中

对于Linux系统,我们常见的输入输出的类型有:

  • 标准输入 0
  • 标准正确输出 1
  • 标准错误输出 2

image-20191212134441023

File Descriptors(FD,文件描述符 )

案例切入:通过vim来追踪fd的信息

我们打开两个终端,然后在其中一个终端中使用vim打开一个文件,然后在另一个终端中查看与FD相关的文件

终端一:vim file.txt

终端二:
[root@192 fd]# ps aux | grep vim
root      16350  0.0  0.2 149432  5064 pts/1    S+   23:01   0:00 vim file1.txt
root      16360  0.0  0.0 112724   984 pts/0    S+   23:03   0:00 grep --color=auto vim
[root@192 fd]# cd /proc/16350/fd
[root@192 fd]# ll
总用量 0
lrwx------. 1 root root 64 6月   1 23:01 0 -> /dev/pts/1
lrwx------. 1 root root 64 6月   1 23:01 1 -> /dev/pts/1
lrwx------. 1 root root 64 6月   1 23:01 2 -> /dev/pts/1
lrwx------. 1 root root 64 6月   1 23:01 3 -> /root/.file1.txt.swp

# 这里有0 1 2 3
其中0表示标准输入
1表示标准正确输出
2表示标准错误输出
其他的都为输出到文件中

# 我们可以尝试通过0来向我们刚刚vim打开的文档里面输入内容
[root@192 fd]# echo hello > 0

这里也是体现Linux一切皆文件的特性,连输入输出都可以由文件来进行控制
Number Channel name Description Default connection Usage
0 stdin 标准输入 键盘 只读
1 stdout 标准输出 命令行 只写
2 stderr 标准错误 命令行 只写
3+ filename 其他文件 none 读 and/or 写

输出重定向(覆盖,追加)

>:覆盖重定向

>>:追加重定向

1>:覆盖重定向正确的输出数据流

1>>:追加重定向正确的输出数据流

2>:覆盖重定向错误输出数据流

2>>:追加重定向错误输出数据流

示例一:输出重定向(覆盖)

[root@localhost ~]# date 1> date.txt
[root@localhost ~]# cat date.txt

image-20191212135557868

示例二:输出重定向(追加)

[root@localhost ~]# date >> date.txt
[root@localhost ~]# date >> date.txt
[root@localhost ~]# date >> date.txt
[root@localhost ~]# cat date.txt

image-20191212135745653

示例三:错误输出重定向

[root@localhost ~]# touch file
[root@localhost ~]# cd file
bash: cd: file: 不是目录
[root@localhost ~]# cd file 2> log.txt
[root@localhost ~]# cat log.txt
bash: cd: file: 不是目录

image-20191212135934506

示例四:正确和错误都输入到相同位置

[root@localhost ~]# ls /home/ /test
ls: 无法访问/test: 没有那个文件或目录
/home/:
user01

#将正确和错误的输出都输出的文件中
[root@localhost ~]# ls /home/ /test &> log.txt
[root@localhost ~]# cat log.txt
ls: 无法访问/test: 没有那个文件或目录
/home/:
user01

image-20191212140103719

示例五:正确和错误都输入到相同位置

[root@localhost ~]# ls /home/ /test > log.txt
ls: 无法访问/test: 没有那个文件或目录
[root@localhost ~]# ls /home/ /test > log.txt 2>&1
[root@localhost ~]# cat log.txt
ls: 无法访问/test: 没有那个文件或目录
/home/:
user01

image-20191212140224715

示例六:重定向到空设备/dev/null

# /dev/null是一个空设备,可以理解为一个无限大的垃圾堆,可以往里面丢任意多的垃圾进去

[root@localhost ~]# ls /home/ /test > log.txt 2>/dev/null
[root@localhost ~]# cat log.txt
/home/:
user01

[root@localhost ~]# ls /home/ /test &>/dev/null

输入重定向

标准输入:< 等价 0<

案例1:

[root@localhost ~]# 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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
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
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
user01:x:1000:1000::/home/user01:/bin/bash

案例2:

[root@localhost ~]# grep 'root' < /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

案例3:at

[root@localhost ~]# at now +5 min
at> ping -c4 baidu.com
at> <EOT>
job 1 at Thu Dec 12 15:50:00 2019
[root@localhost ~]# vim at.txt
ping -c4 baidu.com
[root@localhost ~]# at now +1 min < at.txt 
job 2 at Thu Dec 12 15:47:00 2019

案例4:利用重定向建立多行的文件

[root@localhost ~]# cat > file2.txt <<EOF
> hello
> python
> linux
> EOF
[root@localhost ~]# cat file2.txt
hello
python
linux

进程管道

用法:command1 | command2 | command3 | ....

image-20191212160628460

[root@localhost ~]# ll /dev/ |less
[root@localhost ~]# ps aux |grep 'sshd'
[root@localhost ~]# rpm -qa |grep 'httpd'
[root@localhost ~]# yum list |grep 'httpd'

案例1:统计出最占CPU的5个进程

[root@localhost ~]# ps aux --sort=-%cpu |head -6

案例2:过滤secure文件中跟ssh相关的内容

[root@localhost ~]# cat /var/log/secure | grep ssh

tee管道

image-20191212163943080

[root@localhost ~]# du -h . | sort -hr | tee file_sizes.txt
44K     .
0       ./dir1
0       ./dir

使用 du 命令列出当前目录下的文件大小,然后通过管道传递给 sort 命令进行降序排序。最后使用 tee 命令将排序结果同时输出到终端和 file_sizes.txt 文件中。这样既可以在终端查看结果,也可以保存一份供后续分析使用
学前沿IT,到英格科技!本文发布时间: 2024-06-02 09:52:32

results matching ""

    No results matching ""