第7章 重定向和管道
1.重定向
(1)FD(file descriptor/文件描述符/句柄)简介
-------file descriptors (FD,文件描述符 或 Process I/O channels):进程使用文件描述符来管理打开的文件
标准输入0、标准输出1、标准错误输出2
进程有标识符。PID是身份证。
FD是访问文件的标识,0是键盘只读,1,2是终端可以理解是屏幕,3+是文件,可读可写。
程序通过描述符访问文件,可以是常规文件,也可以是设备文件。
(2)输出重定向案例 >
1.不同信息重定向到不同位置
# ls /home/ /aaaaaaaaa 1>list.txt 2>error.txt
//重定向到不同的位置---正确信息重定向到list.txt,错误信息重定向到error.txt
2.正确和错误都输入到相同位置
# ls /home/ /aaaaaaaaa &> list.txt //混合输出
# ls /home/ /aaaaaaaaa >list.txt 2>&1 //重定向到相同的位置---与上个命令功能相同
3.重定向到空设备(垃圾箱)/dev/null
# ls /home/ /aaaaaaaaa >list.txt 2>/dev/null //正确的输入到list.txt中,错误的丢到/dev/null空设备垃圾箱中
# ls /home/ /aaaaaaaaa &> /dev/null //空设备,即将产生的输出丢掉
扩展:
假如回收站丢失。1 重启即可恢复。
2 手动创建
mknod -m 666 /dev/null c 1 3
1 主设备号,类型
3 从设备号,序号
脚本:
案例1:脚本中使用重定向[[email protected] ~]# vim ping.sh
#!/usr/bin/bash
ping -c1 172.16.120.254 &>/dev/null
if [ $? -eq 0 ];then
echo "up.."
else
echo "down.."
fi
[[email protected] ~]# bash ping.sh
案例2:脚本中使用重定向
# vim ping2.sh
#!/usr/bin/bash
ping -c1 172.16.120.254 &>/dev/null
if [ $? -eq 0 ];then
echo "172.16.120.254 up.." >> /up.txt
else
echo "172.16.120.254 down.." >> /down.txt
fi
# bash ping2.sh
(3)输入重定向案例
标准输入: < 等价 0<
1.重定向发送邮件
(1)观察默认发邮件的过程
[[email protected] ~]# mail -s "jianli" alice //默认键盘输入内容(s----send发送的意思,双引号中是邮件的名称)
111
222
333
. -----点 (或者ctrl+d) //点代表邮件创建结束。 (按ctrl+Backspace 删除已经书写的内容)
[[email protected] ~]# su - bjz //切换用户
[[email protected] ~]# mail
Mail version 8.1 6/6/93. Type ? for help.
"/var/spool/mail/alice": 1 message 1 new
>N 1 [email protected] Mon Oct 29 14:09 18/657 "ssss"
&
按邮件编号:1--即可看邮件。
(2)使用重定向快速创建邮件
如果已经有了现成的邮件内容呢,如何快速输入邮件内容。就可以用重定向创建邮件!!!
[[email protected] ~]# mail -s "test01" bjz < /mail.txt
在根下创建文件mail.txt,把现成的邮件内容输入到文件mail.txt中,然后利用重定向,快速的把内容输入到给用户bjz的邮件中。
2.通过dd命令理解输入输出重定向------dd 快速创建文件
if输入 of输出 bs大小 count计数(写几次)
[[email protected] ~]# dd if=/dev/zero of=/file1.txt bs=1M count=2
# ll -h /file1.txt h------human(人性化显示)
可以看到文件大小。----会显示2M
利用重定向输入输出
[[email protected] ~]# dd < /dev/zero > /file2.txt bs=2M count=30
# ll -h /file1.txt h------human(人性化显示)
可以看到文件大小。----会显示60M
3.自动创建任务计划at
(1) 先理解at任务计划原理。
[[email protected] ~]# at now +5 min
at> useradd 20180404
at> <EOT> ----------- //ctrl+d 结束
job 1 at 2015-06-09 11:57
(2 )通过重定向,自动创建人物计划。
[[email protected] ~]# vim testat.txt
useradd bjz1
useradd bjz2
[[email protected] ~]# at now +2 min < testat.txt-------->在2分钟后执行testat.txt中的内容
job 2 at 2015-06-09 11:55
4. 利用输入重定向(段落标记EOF)建立多行的文件
[[email protected] ~]# cat >file.txt <<EOF -------(把EOF段里输入的内容输入到cat再重定向到file.txt中)EOF 只表示段的开始和段的结束
> 111
> 222
> 333
> EOF
[[email protected] ~]# cat file.txt
111
222
333
5.输出重定向技巧
请思考两条指令能否将结果一起输出去到垃圾桶
[[email protected]~]# ls &> /dev/null ; date &>> /dev/null (或date &> /dev/null) -------- ;--->分号是排列命令的意思
是不是可以这样做,()括起来作为整体。达到和上面命令一样的效果
[[email protected] ~]# (ls; date) &> /dev/null
2.管道
1.进程管道 Piping
重定向和管道的区别在于,输出到文件和程序。
重定向输出到各种文件。管道是输出到一个程序。
2.tee管道(三通)
想追加到某个文件,使用 -a --->(追加,不用-a下一次内容会进行覆盖)
[[email protected] ~]# ip addr | grep 'inet ' | awk -F"/" '{print $1}' | tee -a ip.txt | awk '{print $2}'
127.0.0.1
172.16.60.1
解释:| tee -a ip.txt | ----把此命令前面的命令得到的内容追加到ip.txt中
3.参数传递xargs
ls cp rm一些特殊命令,只接受命令行参数中指定的处理内容,不从标准输入中获取处理内容。
例题1 (ls和rm命令)
# cat files.txt |xargs rm -rvf
------>意思是:cat把file.txt中的内容显示出来,通过管道传递给rm,然后rm删除当前目录下与file.txt中显示内容(显示的文件名)相同的文件
解释:加上xargs可以让rm这种特殊命令执行
例题2 (cp命令) xargs -I 指定输出标记
# cat files.txt | xargs -I BJZ cp -rvf BJZ /var/tmp
因为cp -rf 命令后面需要跟多个参数,所以用 -I 来标记一个参数,用BJZ来标记cat file.txt输出的内容作为源文件
例题3 find查询
find 查询-----不管当前在什么路径下都能找到
[[email protected] ~]# find /etc -iname "ifcfg*" | xargs -I BJZ cp -rf BJZ /tmp
注:find后面跟查找的位置,想要查找的东西在根下的哪个文件中(/etc) -iname 后加(查找的内容,名字叫什么)
-name :按照文件名查找文件(精确查找);-iname不区分文件名大小写进行查找(用法:find -iname test.c)