【运维基础】Linux的输入输出重定向
本文介绍了Linux系统中输入输出重定向的核心概念与操作技巧。通过不同符号实现不同重定向功能:">"覆盖写入标准输出,">>"追加写入标准输出,"2>"重定向错误输出,"&>"同时重定向标准输出和错误输出。文章通过查找/etc/passwd文件的实例演示了各种重定向方式的具体应用,
·
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 7月 22 21:23 allinone
-rw-rw-r--. 1 li li 1338 7月 22 21:33 ext4.man
-rw-rw-r--. 1 li li 0 7月 22 16:04 file-20250722
-rw-rw-r--. 1 li li 34 7月 22 16:26 hello.txt
-rw-rw-r--. 1 li li 1594 7月 22 21:30 passwd.all
-rw-rw-r--. 1 li li 1534 7月 22 21:27 passwd.err
-rw-rw-r--. 1 li li 60 7月 22 21:27 passwd.list
-rw-r--r--. 1 li li 1819 7月 22 17:21 profile.sh
-rw-rw-r--. 1 li li 0 7月 22 21:28 testfile
drwxr-xr-x. 2 li li 6 7月 18 10:37 公共
drwxr-xr-x. 2 li li 6 7月 18 10:37 模板
drwxr-xr-x. 2 li li 6 7月 18 10:37 视频
drwxr-xr-x. 2 li li 6 7月 18 10:37 图片
drwxr-xr-x. 2 li li 6 7月 18 10:37 文档
drwxr-xr-x. 2 li li 6 7月 18 10:37 下载
drwxr-xr-x. 2 li li 6 7月 18 10:37 音乐
drwxr-xr-x. 2 li li 6 7月 18 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
更多推荐




所有评论(0)