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)