由于Shell脚本“批量处理”的特殊性,所以其大部分操作过程以静默方式运行,不需要用户进行干预。因此学会提取、过滤执行信息
变得十分重要,Shell环境中的两个I/O操作:重定向、管道。
Linux系统使用文件来描述各种硬件、设备等资源,如以前学过的硬盘和分区、光盘等设备文件。用户通过操作系统处理信息的过程中,包括以下几类交互设备文件。
标准输入(STDIN):默认的设备是键盘,文件编号为0,命令将从标准输入文件中读取在执行过程中需要的输入数据。
标准输出(STDOUT):默认的设备是显示器,文件编号为1,命令将执行后的输出结果发送到标准输出文件。
标准错误(STDERR):默认的设备是显示器,文件编号为2,命令将执行期间的各种错误信息发送到标准错误文件。 标准输入、标准输出和标准错误默认使用键盘和显示器作为关联的设备,与操作系统进行交互,完成最基本的输入、输出操作,即从键盘接收用户输入的各种命令字串、辅助控制信息,并将命令结果输出到屏幕上;如果命令执行出错,也会将错误信息反馈到屏幕上。 在实际的Linux系统维护中,可以改变输入、输出内容的方向,而不使用默认的标准输入、输出设备(键盘和显示器),这种操作称为重定向。 1)重定向输出 重定向输出指的是将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上。重定向输出使用“>”或“>>”操作符号,分别用于覆盖或追加文件。 若重定向输出的目标文件不存在,则会新建该文件,然后将前面命令的输出结果保存到该文件中;若目标文件已经存在,则将输出结果覆盖或追加到文件中。
// CPU类型信息(uname -p)保存到kernel.txt文件中,而不是直接显示在屏幕上,可以执行以下操作。
`[root@localhost ~]# uname -p > kernel.txt
[root@localhost ~]# cat kernel.txt
x86_64
//表示把指定的统计信息追加到 kernel.txt这个文件里
[root@localhost ~]# uname -r >> kernel.txt
[root@localhost ~]# cat kernel.txt
x86_64 3.10.0-514.el7.x86_64
重定向输入
重定向输入指的是将命令中接收输入的途径由默认的键盘改为指定的文件,而不是等待从键盘输入。重定向输入使用“<”操作符。
[root@localhost ~]# vim pass.txt //添加初始密码串内容"123456"
123456
[root@localhost ~]# passwd --stdin laoshi< pass.txt //从pass.txt文件中取密码 123456,并且给laoshi这个用户设置密码
Changing
password for user jerry. passwd: all authentication tokens updated successfully.
错误重定向:
就是把一些命令执行之后,他可能会报错。产生一些报错信息。
那么我们不希望,这些报错信息,直接打到屏幕上。因此,我们做了一个错误重定向的操作。将这些信息存储到另外一个文件当中
[root@localhost ~]# tar jcf /nonedir/etc.tgz /etc/ 2> error.log
[root@localhost ~]# cat error.log
tar: Removing leading `/' from member namestar (child): /nonedir/etc.tgz: Cannot open : No such file or directory tar (child): Error is not recoverable: exiting now
// 使用tar命令进行备份时出现的错误信息保存到error.log文件中。
``注意事项:
在使用“2>”操作符时,会像使用“>”操作符一样覆盖目标文件的内容,若要追加内容而不是覆盖文件,则应改用“2>>”操作符。 当命令输出的结果可能既包括标准输出(正常执行)信息,又包括错误输出信息时,可以使用操作符“>” “2>”将两类输出信息分别保存到不同的文件,也可以使用“&>”操作符将两类输出信息保存到同一个文件。例如,在编译源码包的自动化脚本中,若要忽略make、make install等操作过程信息,则可以将其定向到空文件/dev/null
[root@localhost ~]# vim httpd_install.sh
#!/bin/bash # 自动编译安装httpd服务器的脚本
cd /usr/src/httpd-2.4.25/
./configure --prefix=/usr/local/httpd --enable-so &> /dev/null make &> /dev/null
make install &> /dev/null
[root@localhost ~]# chmod +x httpd_install.sh //加权限
//这就可以通过shell脚本的方式完成Apache的编译安装
//注意本地要有这个http包
管道操作 管道(pipe)操作为不同命令之间的协同工作提供了一种机制,
位于管道符号“|”左侧的命令输出的结果,
将作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。
[root@localhost ~]# grep "/bin/bash$" /etc/passwd //提取之前 root:x:0:0:root:/root:/bin/bash bdqn:x:1000:1000:bdqn:/home/bdqn:/bin/bash tsengyia:x:1002:1002::/home/tsengyia:/bin/bash jerry:x:1003:1003::/home/jerry:/bin/bash lisi:x:1004:1004::/home/lisi:/bin/bash
[root@localhost ~]# grep "/bin/bash$" /etc/passwd | awk -F: '{print $1,$7}'
//提取之后 root /bin/bash bdqn /bin/bash tsengyia /bin/bash jerry /bin/bash lisi /bin/bash
[root@localhost ~]# df -hT //提取之前
Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/cl-root xfs 50G 8.0G 43G 16% / devtmpfs devtmpfs 473M 0 473M 0% /dev tmpfs tmpfs 489M 144K 489M 1% /dev/shm tmpfs tmpfs 489M 14M 476M 3% /run tmpfs tmpfs 489M 0 489M 0% /sys/fs/cgroup /dev/sda1 xfs 1014M 173M 842M 18% /boot /dev/mapper/cl-home xfs 42G 33M 42G 1% /home tmpfs tmpfs 98M 24K 98M 1% /run/user/0 /dev/sr0 iso9660 4.1G 4.1G 0 100% /media/cdrom [root@localhost ~]# df -hT | grep "/$" | awk '{print $6}' //提取之后其中grep "/$"表示提取以"/"结尾的行
16%
好了,有关于shell编程重定向操作就到这里了,谢谢大家