第四章 输出与重定向和管道详解

4.1 输出重定向

输出即把相关对象通过输出设备(显示器等)显示出来,输出又分正确输出和错误输出。

一般情况下标准输出设备为显示器,标准输入设备为键盘。

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

image-20220501202447927.png

输出重定向:

正常输出是把内容输出到显示器上,而输出重定向是把内容输出到文件中,>代表覆盖,>>代表追加

PS:标准输出的1可以不写

image-20220501202803539.png

  1. root@Ununtu-08:~# ifconfig > xujun.text
  2. root@Ununtu-08:~# cat xujun.text
  3. eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  4. inet 10.0.0.110 netmask 255.255.255.0 broadcast 10.0.0.255
  5. inet6 fe80::20c:29ff:fe95:8f6c prefixlen 64 scopeid 0x20<link>
  6. ether 00:0c:29:95:8f:6c txqueuelen 1000 (Ethernet)
  7. RX packets 32347 bytes 43937486 (43.9 MB)
  8. RX errors 0 dropped 0 overruns 0 frame 0
  9. TX packets 16489 bytes 1093224 (1.0 MB)
  10. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  11. lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
  12. inet 127.0.0.1 netmask 255.0.0.0
  13. inet6 ::1 prefixlen 128 scopeid 0x10<host>
  14. loop txqueuelen 1000 (Local Loopback)
  15. RX packets 644 bytes 46766 (46.7 KB)
  16. RX errors 0 dropped 0 overruns 0 frame 0
  17. TX packets 644 bytes 46766 (46.7 KB)
  18. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  19. PS:错误输出重定向>与>>后边不要加空格

image-20220501203000994.png

  1. 1、以下两个命令作用完全相同
  2. 命令 >> file.log 2>&1
  3. 命令 &>> file.log
  4. 2、系统有个常见用法重定向到/dev/null
  5. ls &> /dev/null #正确输出或错误输出结果都不要

以上如果文件已存在,文件内容会被覆盖

  1. set -C 禁止将内容覆盖已有文件,但是利用>|仍可强制覆盖
  2. set +C 允许覆盖,默认

4.2 输入重定向

  1. #没有改变输入的方向,默认键盘,此时等待输入
  2. [root@xujun ~]# tr 'N' 'n'
  3. No
  4. no
  5. [root@xujun ~]# tr 'N' 'n' < file.txt
  6. #没有改变输入的方向,默认键盘,此时等待输入
  7. [root@xujun ~]# grep 'root'
  8. oldboy
  9. root
  10. root
  11. [root@xujun ~]# grep 'root' < /etc/passwd
  12. root:x:0:0:root:/root:/bin/bash
  13. # 读写块设备
  14. [root@xujun ~]# dd if=/dev/zero of=/file1.txt bs=1M count=20
  15. [root@xujun ~]# dd </dev/zero >/file2.txt bs=1M count=20
  16. # mysql如何恢复备份,了解即可,不用关注。
  17. [root@xujun ~]# mysql -uroot -p123 < bbs.sql

4.2.1 tr命令

  1. tr 转换字符串
  2. 主要选项:
  3. -d 删除
  4. -c 取反
  5. 主要案例:
  6. 转换 tr 'abc' 'XYZ' < xujun.txt (a-X,b-Y,c-z)
  7. tr -cd 'a-z0-9' < /dev/urandom |head -c 10 #取随机字符

4.3 管道

4.3.1 什么是管道

管道就是可以将两个或者多个命令(程序或者进程)连接到一起,把一个命令的输出作为下一个命令的输入。

Linux管道使用竖线|连接多个命令,这被称为管道符。Linux管道的具体语法格式如下:

  1. command1 | command2
  2. command1 | command2 [ | commandN... ]

当在两个命令之间设置管道时,管道符|左边命令的输出就变成了右边命令的输入。只要第一个命令向标准输出写入,而第二个命令是从标准输入读取,那么这两个命令就可以形成一个管道。大部分的 Linux 命令都可以用来形成管道。

这里需要注意,command1 必须有正确输出,而 command2 必须可以处理 command2 的输出结果;而且 command2 只能处理 command1 的正确输出结果,不能处理 command1 的错误信息。

4.3.2 为什么使用管道

我们先看下面一组命令,使用 mysqldump(一个数据库备份程序)来备份一个叫做 wiki 的数据库:

  1. mysqldump -u root -p '123456' wiki > /tmp/wikidb.backup
  2. gzip -9 /tmp/wikidb.backup
  3. scp /tmp/wikidb.backup username@remote_ip:/backup/mysql/

上述这组命令主要做了如下任务:

  • mysqldump 命令用于将名为 wike 的数据库备份到文件 /tmp/wikidb.backup;其中-u-p选项分别指出数据库的用户名和密码。
  • gzip 命令用于压缩较大的数据库文件以节省磁盘空间;其中-9表示最慢的压缩速度最好的压缩效果。
  • scp 命令(secure copy,安全拷贝)用于将数据库备份文件复制到 IP 地址为 remote_ip 的备份服务器的 /backup/mysql/ 目录下。其中username是登录远程服务器的用户名,命令执行后需要输入密码。

上述三个命令依次执行。然而,如果使用管道的话,你就可以将 mysqldump、gzip、ssh 命令相连接,这样就避免了创建临时文件 /tmp/wikidb.backup,而且可以同时执行这些命令并达到相同的效果。

  1. #使用管道效果如下:
  2. mysqldump -u root -p '123456' wiki | gzip -9 | ssh username@remote_ip "cat > /backup/wikidb.gz"

这些使用了管道的命令有如下特点:

  • 命令的语法紧凑并且使用简单。
  • 通过使用管道,将三个命令串联到一起就完成了远程 mysql 备份的复杂任务。
  • 从管道输出的标准错误会混合到一起

image-20220501204543198.png

4.3.3 Linux管道实例

【实例1】使用管道将 cat 命令的输出作为 less 命令的输入,这样就可以将 cat 命令的输出每次按照一个屏幕的长度显示,这对于查看长度大于一个屏幕的文件内容很有帮助。

  1. cat /var/log/message | less

【实例2】查看指定程序的进程运行状态,并将输出重定向到文件中。

  1. [c.biancheng.net]$ ps aux | grep httpd > /tmp/ps.output
  2. [c.biancheng.net]$ cat /tem/ps.output
  3. mozhiyan 4101 13776 0 10:11 pts/3 00:00:00 grep httpd
  4. root 4578 1 0 Dec09 ? 00:00:00 /usr/sbin/httpd
  5. apache 19984 4578 0 Dec29 ? 00:00:00 /usr/sbin/httpd
  6. apache 19985 4578 0 Dec29 ? 00:00:00 /usr/sbin/httpd
  7. apache 19986 4578 0 Dec29 ? 00:00:00 /usr/sbin/httpd
  8. apache 19987 4578 0 Dec29 ? 00:00:00 /usr/sbin/httpd
  9. apache 19988 4578 0 Dec29 ? 00:00:00 /usr/sbin/httpd
  10. apache 19989 4578 0 Dec29 ? 00:00:00 /usr/sbin/httpd
  11. apache 19990 4578 0 Dec29 ? 00:00:00 /usr/sbin/httpd
  12. apache 19991 4578 0 Dec29 ? 00:00:00 /usr/sbin/httpd

【实例3】统计系统中当前登录的用户数。

  1. [c.biancheng.net]$ who | wc -l
  2. 5