第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管道(三通)

第7章 重定向和管道

想追加到某个文件,使用 -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)