Linux的输入输出重定向

输入输出重定向是 Linux 系统 “一切皆文件” 思想的具体实践,它让命令的交互更灵活、功能更强大,是从 “手动执行命令” 到 “自动化系统管理” 的必备基础,也是理解 Linux 命令行本质的核心概念之一。

标准输出重定向到文件

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

> 符号:

可以使用 > 符号将命令的输出重定向到文件。

补充说明:

> 也可写成1>,但是1和>之间不能有空格

>> 符号

与 > 符号不同,>> 符号用于将命令的输出附加到文件的末尾,而不是覆盖文件中的内容。

2> 符号

使用 2> 符号将错误输出重定向到文件。

&> 符号

使用 &> 符号将命令的所有输出(标准输出和错误输出)都重定向到文件中。

演示:

# 查找 /etc 目录下 文件名是passwd的所有文件
[li@centos7 ~ 21:21:46]$ find /etc -name 'passwd'
find: ‘/etc/grub.d’: 权限不够
find: ‘/etc/pki/CA/private’: 权限不够
find: ‘/etc/pki/rsyslog’: 权限不够
/etc/pam.d/passwd
find: ‘/etc/dhcp’: 权限不够
/etc/passwd
find: ‘/etc/selinux/targeted/active’: 权限不够
find: ‘/etc/selinux/final’: 权限不够
find: ‘/etc/lvm/archive’: 权限不够
find: ‘/etc/lvm/backup’: 权限不够
find: ‘/etc/lvm/cache’: 权限不够
find: ‘/etc/polkit-1/rules.d’: 权限不够
find: ‘/etc/polkit-1/localauthority’: 权限不够
find: ‘/etc/firewalld’: 权限不够
find: ‘/etc/audisp’: 权限不够
find: ‘/etc/audit’: 权限不够
find: ‘/etc/ipsec.d’: 权限不够
find: ‘/etc/libvirt’: 权限不够
find: ‘/etc/cups/ssl’: 权限不够
find: ‘/etc/sudoers.d’: 权限不够

# 将找到的文件名清单覆盖写入到passwd.list文件中
[li@centos7 ~ 21:22:06]$ find /etc -name 'passwd' 1>passwd.list
find: ‘/etc/grub.d’: 权限不够
find: ‘/etc/pki/CA/private’: 权限不够
find: ‘/etc/pki/rsyslog’: 权限不够
find: ‘/etc/dhcp’: 权限不够
find: ‘/etc/selinux/targeted/active’: 权限不够
find: ‘/etc/selinux/final’: 权限不够
find: ‘/etc/lvm/archive’: 权限不够
find: ‘/etc/lvm/backup’: 权限不够
find: ‘/etc/lvm/cache’: 权限不够
find: ‘/etc/polkit-1/rules.d’: 权限不够
find: ‘/etc/polkit-1/localauthority’: 权限不够
find: ‘/etc/firewalld’: 权限不够
find: ‘/etc/audisp’: 权限不够
find: ‘/etc/audit’: 权限不够
find: ‘/etc/ipsec.d’: 权限不够
find: ‘/etc/libvirt’: 权限不够
find: ‘/etc/cups/ssl’: 权限不够
find: ‘/etc/sudoers.d’: 权限不够
[li@centos7 ~ 21:22:54]$cat passwd.list 
/etc/pam.d/passwd
/etc/passwd

# 将多个文件内容合并为1个
[li@centos7 ~ 21:23:23]$cat /etc/fstab /etc/hosts > allinone

# 将找到的文件名清单追加写入到passwd.list文件中
[li@centos7 ~ 21:23:58]$ find /etc -name 'passwd' 1>>passwd.list
find: ‘/etc/grub.d’: 权限不够
find: ‘/etc/pki/CA/private’: 权限不够
find: ‘/etc/pki/rsyslog’: 权限不够
find: ‘/etc/dhcp’: 权限不够
find: ‘/etc/selinux/targeted/active’: 权限不够
find: ‘/etc/selinux/final’: 权限不够
find: ‘/etc/lvm/archive’: 权限不够
find: ‘/etc/lvm/backup’: 权限不够
find: ‘/etc/lvm/cache’: 权限不够
find: ‘/etc/polkit-1/rules.d’: 权限不够
find: ‘/etc/polkit-1/localauthority’: 权限不够
find: ‘/etc/firewalld’: 权限不够
find: ‘/etc/audisp’: 权限不够
find: ‘/etc/audit’: 权限不够
find: ‘/etc/ipsec.d’: 权限不够
find: ‘/etc/libvirt’: 权限不够
find: ‘/etc/cups/ssl’: 权限不够
find: ‘/etc/sudoers.d’: 权限不够
[li@centos7 ~ 21:24:30]$ cat passwd.list 
/etc/pam.d/passwd
/etc/passwd
/etc/pam.d/passwd
/etc/passwd

# 将错误信息覆盖写入到passwd.err文件中
[li@centos7 ~ 21:24:52]$find /etc -name 'passwd' 2>passwd.err
/etc/pam.d/passwd
/etc/passwd
[li@centos7 ~ 21:25:19]$cat passwd.err 
find: ‘/etc/grub.d’: 权限不够
find: ‘/etc/pki/CA/private’: 权限不够
find: ‘/etc/pki/rsyslog’: 权限不够
find: ‘/etc/dhcp’: 权限不够
find: ‘/etc/selinux/targeted/active’: 权限不够
find: ‘/etc/selinux/final’: 权限不够
find: ‘/etc/lvm/archive’: 权限不够
find: ‘/etc/lvm/backup’: 权限不够
find: ‘/etc/lvm/cache’: 权限不够
find: ‘/etc/polkit-1/rules.d’: 权限不够
find: ‘/etc/polkit-1/localauthority’: 权限不够
find: ‘/etc/firewalld’: 权限不够
find: ‘/etc/audisp’: 权限不够
find: ‘/etc/audit’: 权限不够
find: ‘/etc/ipsec.d’: 权限不够
find: ‘/etc/libvirt’: 权限不够
find: ‘/etc/cups/ssl’: 权限不够
find: ‘/etc/sudoers.d’: 权限不够

# 将错误信息扔掉
[li@centos7 ~ 21:25:36]$find /etc -name 'passwd' 2>/dev/null
/etc/pam.d/passwd
/etc/passwd

# 将错误信息追加写入到passwd.err文件中
[li@centos7 ~ 21:26:01]$find /etc -name 'passwd' 2>>passwd.err
/etc/pam.d/passwd
/etc/passwd
[li@centos7 ~ 21:26:30]$cat passwd.err 
find: ‘/etc/grub.d’: 权限不够
find: ‘/etc/pki/CA/private’: 权限不够
find: ‘/etc/pki/rsyslog’: 权限不够
find: ‘/etc/dhcp’: 权限不够
find: ‘/etc/selinux/targeted/active’: 权限不够
find: ‘/etc/selinux/final’: 权限不够
find: ‘/etc/lvm/archive’: 权限不够
find: ‘/etc/lvm/backup’: 权限不够
find: ‘/etc/lvm/cache’: 权限不够
find: ‘/etc/polkit-1/rules.d’: 权限不够
find: ‘/etc/polkit-1/localauthority’: 权限不够
find: ‘/etc/firewalld’: 权限不够
find: ‘/etc/audisp’: 权限不够
find: ‘/etc/audit’: 权限不够
find: ‘/etc/ipsec.d’: 权限不够
find: ‘/etc/libvirt’: 权限不够
find: ‘/etc/cups/ssl’: 权限不够
find: ‘/etc/sudoers.d’: 权限不够
find: ‘/etc/grub.d’: 权限不够
find: ‘/etc/pki/CA/private’: 权限不够
find: ‘/etc/pki/rsyslog’: 权限不够
find: ‘/etc/dhcp’: 权限不够
find: ‘/etc/selinux/targeted/active’: 权限不够
find: ‘/etc/selinux/final’: 权限不够
find: ‘/etc/lvm/archive’: 权限不够
find: ‘/etc/lvm/backup’: 权限不够
find: ‘/etc/lvm/cache’: 权限不够
find: ‘/etc/polkit-1/rules.d’: 权限不够
find: ‘/etc/polkit-1/localauthority’: 权限不够
find: ‘/etc/firewalld’: 权限不够
find: ‘/etc/audisp’: 权限不够
find: ‘/etc/audit’: 权限不够
find: ‘/etc/ipsec.d’: 权限不够
find: ‘/etc/libvirt’: 权限不够
find: ‘/etc/cups/ssl’: 权限不够
find: ‘/etc/sudoers.d’: 权限不够

# 将错误信息正确信息覆盖写入到不同文件
[li@centos7 ~ 21:26:43]$find /etc -name 'passwd' >passwd.list 2>passwd.err

# 将错误信息正确信息追加写入到不同文件
[li@centos7 ~ 21:27:22]$find /etc -name 'passwd' >>passwd.list 2>>passwd.err

# 用于清空文件内容,也可用于创建一个空文件testfile
[li@centos7 ~ 21:27:51]$> testfile
[li@centos7 ~ 21:28:21]$>> testfile

在这里插入图片描述

# 将错误信息正确信息覆盖写入到相同文件
[li@centos7 ~ 21:28:37]$find /etc -name 'passwd' &>passwd.all 
# 将错误信息正确信息追加写入到相同文件
[li@centos7 ~ 21:29:52]$find /etc -name 'passwd' &>>passwd.all

标准输出重定向到程序

管道符(|)实现,将上一个命令的输出作为标准输入传递给下一个命令。

grep命令:是Linux系统中的一个强大的文本搜索工具,它使用正则表达式来搜索文本,并将匹配的行打印出来。

在这里插入图片描述

# 示例1 查看哪个man page 可以resize ext4文件系统大小

# 搜索所有ext4手册,并报错到ext4.man文件中
[li@centos7 ~ 21:30:21]$man -k ext4 > ext4.man
# 过滤ext4.man文件中含有resize的行
[li@centos7 ~ 21:33:50]$grep resizer ext4.man
resize2fs (8)        - ext2/ext3/ext4 file system resizer
# 以上两个命令和合并为一行
[li@centos7 ~ 21:34:15]$man -k ext4 | grep resizer
resize2fs (8)        - ext2/ext3/ext4 file system resizer

# 示例2 获取ens33网卡ip地址
[li@centos7 ~ 21:34:45]$ip addr | grep 'ens33$' | awk '{print $2}'|cut -d/ -f1
10.1.8.10

**注意:**管道符号后的命令必须能够接收标准输入,例如ls====接收管道传递过来的标准输入。

[li@centos7 ~ 21:35:20]$echo /etc/passwd | ls -l 
总用量 28
-rw-rw-r--. 1 li li  699 722 21:23 allinone
-rw-rw-r--. 1 li li 1338 722 21:33 ext4.man
-rw-rw-r--. 1 li li    0 722 16:04 file-20250722
-rw-rw-r--. 1 li li   34 722 16:26 hello.txt
-rw-rw-r--. 1 li li 1594 722 21:30 passwd.all
-rw-rw-r--. 1 li li 1534 722 21:27 passwd.err
-rw-rw-r--. 1 li li   60 722 21:27 passwd.list
-rw-r--r--. 1 li li 1819 722 17:21 profile.sh
-rw-rw-r--. 1 li li    0 722 21:28 testfile
drwxr-xr-x. 2 li li    6 718 10:37 公共
drwxr-xr-x. 2 li li    6 718 10:37 模板
drwxr-xr-x. 2 li li    6 718 10:37 视频
drwxr-xr-x. 2 li li    6 718 10:37 图片
drwxr-xr-x. 2 li li    6 718 10:37 文档
drwxr-xr-x. 2 li li    6 718 10:37 下载
drwxr-xr-x. 2 li li    6 718 10:37 音乐
drwxr-xr-x. 2 li li    6 718 10:37 桌面

补充:|& 标准错误和标准输出同时传递给下一个命令,作为下一个命令的标准输入。

tee 命令

在这里插入图片描述

tee 命令作用,接收管道传递过来的stdin,并继续作为stdout输出

[li@centos7 ~ 21:37:10]$ > passwd.list 
[li@centos7 ~ 21:39:31]$ cat passwd.list
# tee命令覆盖保存到文件
[li@centos7 ~ 21:39:39]$find /etc -name 'passwd' 2>/dev/null | tee passwd.list
/etc/pam.d/passwd
/etc/passwd
[li@centos7 ~ 21:40:14]$ cat passwd.list  
/etc/pam.d/passwd
/etc/passwd

# tee命令追加保存到文件
[li@centos7 ~ 21:40:32]$ find /etc -name 'passwd' 2>/dev/null |tee -a passwd.list
/etc/pam.d/passwd
/etc/passwd
[li@centos7 ~ 21:41:01]$ cat passwd.list
/etc/pam.d/passwd
/etc/passwd
/etc/pam.d/passwd
/etc/passwd

# tee的标准输出继续通过管道传递下去
[li@centos7 ~ 21:41:16]$man -k passwd | tee passwd.man | grep passwd
chgpasswd (8)        - 批量更新组密码
chpasswd (8)         - 批量更新密码
gpasswd (1)          - administer /etc/group and /etc/gshadow
mkpasswd (1)         - 为用户产生新口令
passwd (5)           - (未知的主题)
smbpasswd (5)        - Samba加密的口令文件。
smbpasswd (8)        - 改变用户的SMB口令
yppasswd (1)         - 修改你在NIS数据库中的密码
fgetpwent_r (3)      - get passwd file entry reentrantly
getpwent_r (3)       - get passwd file entry reentrantly
grub2-mkpasswd-pbkdf2 (1) - Generate a PBKDF2 password hash.
lpasswd (1)          - Change group or user password
lppasswd (1)         - add, change, or delete digest passwords.
pam_localuser (8)    - require users to be listed in /etc/passwd
passwd (1)           - update user's authentication tokens
sslpasswd (1ssl)     - compute password hashes
passwd2des (3)       - RFS password encryption
pwhistory_helper (8) - Helper binary that transfers password hashes from passwd or shadow to opasswd
saslpasswd2 (8)      - set a user's sasl password
vncpasswd (1)        - change the VNC password

标准输入重定向给程序

  • ‘<’ 反向重定向
[li@centos7 ~ 21:41:44]$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

# cat命令标准输入数据
[li@centos7 ~ 21:43:40]$ cat < /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

[li@centos7 ~ 21:44:22]$ cat
hello      # 键盘输入hello后回车
hello      # 屏幕上显示hello
ctrl+d     # 输入完成,退出

# shell读取到EOF时候,代表标准输入完成
[li@centos7 ~ 21:44:54]$ cat << EOF
> hello
> world
> EOF     # 注:这个EOF由自己定义,可以是任何数据比如okokok
hello
world

判定一个命令是否接收标准输入:最简单的方式就是将文件内容作为标准输入重定向给程序。

如何一次性将多行内容写入到文件中?

# 方法1:使用引号
[li@centos7 ~ 21:49:26]$ echo 'hello world
> hello python
> hello linux' > multi_lines.txt
[li@centos7 ~ 21:50:14]$ cat multi_lines.txt 
hello world
hello python
hello linux

# 方法2:使用cat重定向
[li@centos7 ~ 21:50:31]$ cat > multi_lines.txt << EOF
> hello boy
> hello girl
> hello everyone
> EOF
[li@centos7 ~ 21:51:33]$ cat multi_lines.txt 
hello boy
hello girl
hello everyone

Logo

一站式 AI 云服务平台

更多推荐