一、将输出重定向到文件或程序。
用法 | 说明 |
---|---|
> file | 重定向标准输出(stdout);以覆盖文件 |
>> file | 重定向标准输出(stdout);以附加到文件 |
2> file | 重定向标准输入(stderr);以覆盖文件 |
2> /dev/null | 将标准输入(stderr)错误消息重定向到/dev/null,从而将他丢弃 |
&> file 或 > file 2>&1 | 重定向标准输出(stdout)和标准输入(stderr)以覆盖同一个文件 |
&>> file 或 >> file 2>&1 | 重定向标准输出(stdout)和标准输入(stderr)以附加到同一个文件 |
注意:重定向操作的文件顺序非常重要
> file 2>&1
将标准输出重定向到file,然后将标准错误作为标准输出重定向到相同位置(file)。
2>&1 > file
与以上相反,将标准错误重定向到标准输出的默认位置(终端窗口,因此没有任何更改),然后仅将标准输出重定向file。
示例
1、使用date命令查看的时间戳保存到/tmp/dateback中,供日后参考。
[student@controller ~]$ date > /tmp/dateback
[student@controller ~]$ cat /tmp/dateback
Wed 3 Aug 19:55:43 CST 2022
2、将一个日志文件最后100行复制到另一个文件。
[student@controller ~]$ sudo tail -n 100 /var/log/messages > /tmp/end-100
[student@controller ~]$ wc -l /tmp/end-100
100 /tmp/end-100
3、将4个文件连接为1个文件。
[student@controller log]$ sudo cat lastlog maillog tallylog > /tmp/old-log
4、将主目录的隐藏文件名和常规文件名列出到文件中。
[student@controller ~]$ ls -a > /tmp/my-file
5、将输出附加到现有文件。
[student@controller ~]$ echo "new line of information" >> /tmp/many-lines
[student@controller log]$ sudo diff lastlog tallylog >> /tmp/tracking-mode
6、在终端上查看普通命令输出时,将错误重定向到文件。
[student@controller ~]$ find /etc -name passwd 2> /tmp/errors
/etc/pam.d/passwd
/etc/passwd
[student@controller ~]$ cat /tmp/errors
find: ‘/etc/lvm/archive’: Permission denied
find: ‘/etc/lvm/backup’: Permission denied
find: ‘/etc/lvm/cache’: Permission denied
find: ‘/etc/pki/rsyslog’: Permission denied
find: ‘/etc/pki/pesign’: Permission denied
find: ‘/etc/ssh/sshd_config.d’: Permission denied
find: ‘/etc/grub.d’: Permission denied
find: ‘/etc/sssd’: Permission denied
find: ‘/etc/polkit-1/rules.d’: Permission denied
find: ‘/etc/polkit-1/localauthority’: Permission denied
find: ‘/etc/cups/ssl’: Permission denied
find: ‘/etc/cni/net.d’: Permission denied
find: ‘/etc/nftables’: Permission denied
find: ‘/etc/audit’: Permission denied
find: ‘/etc/sudoers.d’: Permission denied
find: ‘/etc/libvirt’: Permission denied
find: ‘/etc/containers/networks’: Permission denied
find: ‘/etc/sos/cleaner’: Permission denied
find: ‘/etc/ipsec.d’: Permission denied
find: ‘/etc/firewalld’: Permission denied
7、将进程输出保存到/tmp/output文件中,将错误消息保存到/tmp/errors文件中。
[student@controller ~]$ find /etc -name passwd > /tmp/output 2> /tmp/errors
[student@controller ~]$ cat /tmp/output
/etc/pam.d/passwd
/etc/passwd
[student@controller ~]$ cat /tmp/errors
find: ‘/etc/lvm/archive’: Permission denied
find: ‘/etc/lvm/backup’: Permission denied
find: ‘/etc/lvm/cache’: Permission denied
find: ‘/etc/pki/rsyslog’: Permission denied
find: ‘/etc/pki/pesign’: Permission denied
find: ‘/etc/ssh/sshd_config.d’: Permission denied
find: ‘/etc/grub.d’: Permission denied
find: ‘/etc/sssd’: Permission denied
find: ‘/etc/polkit-1/rules.d’: Permission denied
find: ‘/etc/polkit-1/localauthority’: Permission denied
find: ‘/etc/cups/ssl’: Permission denied
find: ‘/etc/cni/net.d’: Permission denied
find: ‘/etc/nftables’: Permission denied
find: ‘/etc/audit’: Permission denied
find: ‘/etc/sudoers.d’: Permission denied
find: ‘/etc/libvirt’: Permission denied
find: ‘/etc/containers/networks’: Permission denied
find: ‘/etc/sos/cleaner’: Permission denied
find: ‘/etc/ipsec.d’: Permission denied
find: ‘/etc/firewalld’: Permission denied
8、忽略并丢弃错误消息,但保存进程输出的消息。
[student@controller ~]$ find /etc -name passwd > /tmp/export 2> /dev/null
[student@controller ~]$ cat /tmp/export
/etc/pam.d/passwd
/etc/passwd
[student@controller ~]$ cat /dev/null
9、将输出和生成的错误消息存储在一起。
[student@controller ~]$ find /etc -name passwd &> /tmp/save-both
[student@controller ~]$ cat /tmp/save-both
find: ‘/etc/lvm/archive’: Permission denied
find: ‘/etc/lvm/backup’: Permission denied
find: ‘/etc/lvm/cache’: Permission denied
find: ‘/etc/pki/rsyslog’: Permission denied
find: ‘/etc/pki/pesign’: Permission denied
find: ‘/etc/ssh/sshd_config.d’: Permission denied
/etc/pam.d/passwd
find: ‘/etc/grub.d’: Permission denied
/etc/passwd
find: ‘/etc/sssd’: Permission denied
find: ‘/etc/polkit-1/rules.d’: Permission denied
find: ‘/etc/polkit-1/localauthority’: Permission denied
find: ‘/etc/cups/ssl’: Permission denied
find: ‘/etc/cni/net.d’: Permission denied
find: ‘/etc/nftables’: Permission denied
find: ‘/etc/audit’: Permission denied
find: ‘/etc/sudoers.d’: Permission denied
find: ‘/etc/libvirt’: Permission denied
find: ‘/etc/containers/networks’: Permission denied
find: ‘/etc/sos/cleaner’: Permission denied
find: ‘/etc/ipsec.d’: Permission denied
find: ‘/etc/firewalld’: Permission denied
10、将输出和生成的错误附加到现有文件。
[student@controller ~]$ find /etc -name passwd >> /tmp/save-both 2>&1
[student@controller ~]$ cat /tmp/save-both
find: ‘/etc/lvm/archive’: Permission denied
find: ‘/etc/lvm/backup’: Permission denied
find: ‘/etc/lvm/cache’: Permission denied
find: ‘/etc/pki/rsyslog’: Permission denied
find: ‘/etc/pki/pesign’: Permission denied
find: ‘/etc/ssh/sshd_config.d’: Permission denied
/etc/pam.d/passwd
find: ‘/etc/grub.d’: Permission denied
/etc/passwd
find: ‘/etc/sssd’: Permission denied
find: ‘/etc/polkit-1/rules.d’: Permission denied
find: ‘/etc/polkit-1/localauthority’: Permission denied
find: ‘/etc/cups/ssl’: Permission denied
find: ‘/etc/cni/net.d’: Permission denied
find: ‘/etc/nftables’: Permission denied
find: ‘/etc/audit’: Permission denied
find: ‘/etc/sudoers.d’: Permission denied
find: ‘/etc/libvirt’: Permission denied
find: ‘/etc/containers/networks’: Permission denied
find: ‘/etc/sos/cleaner’: Permission denied
find: ‘/etc/ipsec.d’: Permission denied
find: ‘/etc/firewalld’: Permission denied
find: ‘/etc/lvm/archive’: Permission denied
find: ‘/etc/lvm/backup’: Permission denied
find: ‘/etc/lvm/cache’: Permission denied
find: ‘/etc/pki/rsyslog’: Permission denied
find: ‘/etc/pki/pesign’: Permission denied
find: ‘/etc/ssh/sshd_config.d’: Permission denied
/etc/pam.d/passwd
find: ‘/etc/grub.d’: Permission denied
/etc/passwd
find: ‘/etc/sssd’: Permission denied
find: ‘/etc/polkit-1/rules.d’: Permission denied
find: ‘/etc/polkit-1/localauthority’: Permission denied
find: ‘/etc/cups/ssl’: Permission denied
find: ‘/etc/cni/net.d’: Permission denied
find: ‘/etc/nftables’: Permission denied
find: ‘/etc/audit’: Permission denied
find: ‘/etc/sudoers.d’: Permission denied
find: ‘/etc/libvirt’: Permission denied
find: ‘/etc/containers/networks’: Permission denied
find: ‘/etc/sos/cleaner’: Permission denied
find: ‘/etc/ipsec.d’: Permission denied
find: ‘/etc/firewalld’: Permission denied
二、构建管道
说明:管道是一个或者多个命令的序列,用竖线字符“|”分隔;管道将第一个命令的标准输出连接到下一个命令的标准输入。想象一下:数据正在通过管道从一个进程流向另一个进程,在其流过的管道中每个命令都会略微对其做些改动。
重定向:会向文件发送标准输出或从文件获取标准输入。
管道:会将一个进程的标准输出发送到另一个进程的标准输入。
示例
1、使用ls命令的输出并使用less在终端上以一次一次的方式显示输出。
[student@controller ~]$ ls -l /usr/bin | less
2、ls命令的输出传送到wc -l,用户统计从ls收到的行数,并将该行数显示在终端。
[student@controller ~]$ ls | wc -l
9
3、在管道中输入出当前查询结果的前10行,并将最终结果重定向到一个文件中。
[student@controller ~]$ ls -t | head -n 10 > /tmp/ten-last
[student@controller ~]$ cat /tmp/ten-last
rhel-8.6-x86_64-dvd.iso
Downloads
Desktop
Documents
Music
Pictures
Public
Templates
Videos
三、管道、重定向和tee命令
当重定向与管道组合时,shell会首先设置整个管道,然后重定向输入/输出。如果在管道的中间使用了输出重定向,则输出将转至文件,而不是前往管道中的下一个命令。tee命令克服了这个限制;在管道中,tee将其标准输入复制到其标准输出中,并且还将标准输出重定向到指定为命令参数的文件。如果将数据想象成流经管道的水,那么可将tee视觉化为管道中的T形接头,负责输出在两个方向上的流向。
示例
1、将ls命令的输出重定向到文件,并且将输出传递到less,以便在终端上以一次一屏的方式显示。
[student@controller ~]$ ls -l | tee /tmp/save-both | less
2、如果管道末尾使用了tee,则可以保存命令的最终输出并且同时输出到终端。
[student@controller ~]$ ls -t | head -n 10 | tee /tmp/ten-lest
rhel-8.6-x86_64-dvd.iso
Downloads
Desktop
Documents
Music
Pictures
Public
Templates
Videos
[student@controller ~]$ cat /tmp/ten-lest
rhel-8.6-x86_64-dvd.iso
Downloads
Desktop
Documents
Music
Pictures
Public
Templates
Videos