第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:腳本中使用重定向
[root@tianyun ~]# vim ping.sh
#!/usr/bin/bash
ping -c1 172.16.120.254 &>/dev/null
if [ $? -eq 0 ];then
echo "up.."
else
echo "down.."
fi
[root@tianyun ~]# 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)觀察默認發郵件的過程

[root@bjz ~]# mail -s "jianli" alice     //默認鍵盤輸入內容(s----send發送的意思,雙引號中是郵件的名稱)
111
222
333
.     -----點   (或者ctrl+d)             //點代表郵件創建結束。   (按ctrl+Backspace 刪除已經書寫的內容

[root@tianyun ~]# su - bjz                   //切換用戶       

[root@tianyun ~]# 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)使用重定向快速創建郵件

如果已經有了現成的郵件內容呢,如何快速輸入郵件內容。就可以用重定向創建郵件!!!
[root@bjz ~]# mail -s  "test01"  bjz < /mail.txt
在根下創建文件mail.txt,把現成的郵件內容輸入到文件mail.txt中,然後利用重定向,快速的把內容輸入到給用戶bjz的郵件中。

2.通過dd命令理解輸入輸出重定向------dd 快速創建文件

 if輸入  of輸出    bs大小    count計數(寫幾次)
[root@bjz ~]# dd   if=/dev/zero   of=/file1.txt   bs=1M   count=2
# ll   -h   /file1.txt      h------human(人性化顯示)

可以看到文件大小。----會顯示2M

利用重定向輸入輸出

[root@bjz ~]# dd   <    /dev/zero     >   /file2.txt    bs=2M    count=30

# ll   -h   /file1.txt      h------human(人性化顯示)

可以看到文件大小。----會顯示60M

3.自動創建任務計劃at

    (1) 先理解at任務計劃原理。
        
[root@bjz ~]# at now +5 min
at> useradd 20180404
at> <EOT>  ----------- //ctrl+d 結束
job 1 at 2015-06-09 11:57


    (2 )通過重定向,自動創建人物計劃。

[root@bjz ~]# vim testat.txt
 useradd bjz1
 useradd bjz2
[root@bjz ~]# at  now  +2  min  <  testat.txt-------->在2分鐘後執行testat.txt中的內容
job 2 at 2015-06-09 11:55


4. 利用輸入重定向(段落標記EOF)建立多行的文件

[root@bjz ~]# cat   >file.txt   <<EOF        -------(把EOF段裏輸入的內容輸入到cat再重定向到file.txt中)EOF 只表示段的開始和段的結束
> 111
> 222
> 333
> EOF

[root@bjz ~]# cat file.txt
111
222
333


5.輸出重定向技巧

請思考兩條指令能否將結果一起輸出去到垃圾桶

[root@bjz~]# ls   &>  /dev/null ;   date  &>>  /dev/null (或date  &>  /dev/null) --------  ;--->分號是排列命令的意思

是不是可以這樣做,()括起來作爲整體。達到和上面命令一樣的效果
[root@bjz ~]# (ls; date)   &>  /dev/null

2.管道

1.進程管道 Piping

重定向和管道的區別在於,輸出到文件和程序。

重定向輸出到各種文件。管道是輸出到一個程序。

2.tee管道(三通)

想追加到某個文件,使用 -a   --->(追加,不用-a下一次內容會進行覆蓋)
[root@bjz ~]# 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 查詢-----不管當前在什麼路徑下都能找到

[root@bjz ~]# find   /etc   -iname   "ifcfg*"  |  xargs  -I  BJZ  cp -rf  BJZ  /tmp


注:find後面跟查找的位置,想要查找的東西在根下的哪個文件中(/etc)     -iname  後加(查找的內容,名字叫什麼)

 -name :按照文件名查找文件(精確查找);-iname不區分文件名大小寫進行查找(用法:find -iname test.c)

發佈了34 篇原創文章 · 獲贊 2 · 訪問量 4457
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章