第四章 输出与重定向和管道详解
4.1 输出重定向
输出即把相关对象通过输出设备(显示器等)显示出来,输出又分正确输出和错误输出。
一般情况下标准输出设备为显示器,标准输入设备为键盘。
- 0代表标准输入
- 1代表标准正确输出
- 2代表标准错误输出
输出重定向:
正常输出是把内容输出到显示器上,而输出重定向是把内容输出到文件中,>代表覆盖,>>代表追加
PS:标准输出的1可以不写
root@Ununtu-08:~# ifconfig > xujun.text
root@Ununtu-08:~# cat xujun.text
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.110 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80::20c:29ff:fe95:8f6c prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:95:8f:6c txqueuelen 1000 (Ethernet)
RX packets 32347 bytes 43937486 (43.9 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 16489 bytes 1093224 (1.0 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 644 bytes 46766 (46.7 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 644 bytes 46766 (46.7 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
PS:错误输出重定向>与>>后边不要加空格
1、以下两个命令作用完全相同
命令 >> file.log 2>&1
命令 &>> file.log
2、系统有个常见用法重定向到/dev/null
ls &> /dev/null #正确输出或错误输出结果都不要
以上如果文件已存在,文件内容会被覆盖
set -C 禁止将内容覆盖已有文件,但是利用>|仍可强制覆盖
set +C 允许覆盖,默认
4.2 输入重定向
#没有改变输入的方向,默认键盘,此时等待输入
[root@xujun ~]# tr 'N' 'n'
No
no
[root@xujun ~]# tr 'N' 'n' < file.txt
#没有改变输入的方向,默认键盘,此时等待输入
[root@xujun ~]# grep 'root'
oldboy
root
root
[root@xujun ~]# grep 'root' < /etc/passwd
root:x:0:0:root:/root:/bin/bash
# 读写块设备
[root@xujun ~]# dd if=/dev/zero of=/file1.txt bs=1M count=20
[root@xujun ~]# dd </dev/zero >/file2.txt bs=1M count=20
# mysql如何恢复备份,了解即可,不用关注。
[root@xujun ~]# mysql -uroot -p123 < bbs.sql
4.2.1 tr命令
tr 转换字符串
主要选项:
-d 删除
-c 取反
主要案例:
转换 tr 'abc' 'XYZ' < xujun.txt (a-X,b-Y,c-z)
tr -cd 'a-z0-9' < /dev/urandom |head -c 10 #取随机字符
4.3 管道
4.3.1 什么是管道
管道就是可以将两个或者多个命令(程序或者进程)连接到一起,把一个命令的输出作为下一个命令的输入。
Linux管道使用竖线|连接多个命令,这被称为管道符。Linux管道的具体语法格式如下:
command1 | command2
command1 | command2 [ | commandN... ]
当在两个命令之间设置管道时,管道符|
左边命令的输出就变成了右边命令的输入。只要第一个命令向标准输出写入,而第二个命令是从标准输入读取,那么这两个命令就可以形成一个管道。大部分的 Linux 命令都可以用来形成管道。
这里需要注意,command1 必须有正确输出,而 command2 必须可以处理 command2 的输出结果;而且 command2 只能处理 command1 的正确输出结果,不能处理 command1 的错误信息。
4.3.2 为什么使用管道
我们先看下面一组命令,使用 mysqldump(一个数据库备份程序)来备份一个叫做 wiki 的数据库:
mysqldump -u root -p '123456' wiki > /tmp/wikidb.backup
gzip -9 /tmp/wikidb.backup
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,而且可以同时执行这些命令并达到相同的效果。
#使用管道效果如下:
mysqldump -u root -p '123456' wiki | gzip -9 | ssh username@remote_ip "cat > /backup/wikidb.gz"
这些使用了管道的命令有如下特点:
- 命令的语法紧凑并且使用简单。
- 通过使用管道,将三个命令串联到一起就完成了远程 mysql 备份的复杂任务。
- 从管道输出的标准错误会混合到一起
4.3.3 Linux管道实例
【实例1】使用管道将 cat 命令的输出作为 less 命令的输入,这样就可以将 cat 命令的输出每次按照一个屏幕的长度显示,这对于查看长度大于一个屏幕的文件内容很有帮助。
cat /var/log/message | less
【实例2】查看指定程序的进程运行状态,并将输出重定向到文件中。
[c.biancheng.net]$ ps aux | grep httpd > /tmp/ps.output
[c.biancheng.net]$ cat /tem/ps.output
mozhiyan 4101 13776 0 10:11 pts/3 00:00:00 grep httpd
root 4578 1 0 Dec09 ? 00:00:00 /usr/sbin/httpd
apache 19984 4578 0 Dec29 ? 00:00:00 /usr/sbin/httpd
apache 19985 4578 0 Dec29 ? 00:00:00 /usr/sbin/httpd
apache 19986 4578 0 Dec29 ? 00:00:00 /usr/sbin/httpd
apache 19987 4578 0 Dec29 ? 00:00:00 /usr/sbin/httpd
apache 19988 4578 0 Dec29 ? 00:00:00 /usr/sbin/httpd
apache 19989 4578 0 Dec29 ? 00:00:00 /usr/sbin/httpd
apache 19990 4578 0 Dec29 ? 00:00:00 /usr/sbin/httpd
apache 19991 4578 0 Dec29 ? 00:00:00 /usr/sbin/httpd
【实例3】统计系统中当前登录的用户数。
[c.biancheng.net]$ who | wc -l
5