重定向和管道
本章節內容:
三種I/O設備
把I/O頻道重定向入
使用管道鏈接命令
一、標準輸入和輸出:
程序:指令+數據
讀入數據:Input;輸出數據:Output
打開的文件都有一個fd:file descriptor (文件描述符)
Linux給程序提供三種I/O設備:
標準輸入(STDIN)-0默認接受來自鍵盤的輸入
標準輸出(STDOUT)-1默認輸出到終端窗口
標準錯誤(STDERR)-2默認輸出到終端窗口
I/O重定向:改變默認位置
不是所有的標準輸入都有標準輸出;標準輸出是默認的當前終端窗口。
三種合併正常輸出流和錯誤輸出流的方法:
二、將輸出和錯誤輸出重新定向到文件:
標準輸出和錯誤輸出可以被重定向到文件:
命令操作符號文件名
支持的操作符號包括:
標準輸出和錯誤輸出可以各自定向至不同位置;
瞭解重定向的使用:
1、> 把標準輸出重定向到文件(文件內容會被覆蓋);>> 原有內容基礎上,追加內容;
2、2>把錯誤輸出重定向到文件;2>>: 追加重定向錯誤輸出數據流;
3、&>把合併所有輸出重定向到文件;&>>:追加重定向
COMMAND > /path/to/file.out2> &1 (順序很重要)
COMMAND >> /path/to/file.out2>> &1
新的寫法(&>),入下圖:
以前舊的寫法(2>&1),入下圖:
禁止覆蓋:(針對當前終端有效)
# set -C: 禁止將內容覆蓋已有文件,但可追加(>>)
強制覆蓋:>|
# set +C: 允許覆蓋
4、合併多個程序執行的結果重定向,命令格式爲:(COMMAND;COMMAND) > /path/filename
5、使用字符給系統用戶寫郵件,格式:# mail –s 標題用戶名
回車後,等待內容的輸入,結束以“.”,切記.的前面不能夠空格。
用戶chesfer查看來自root用戶發給其的郵件,如下圖:
6、多行輸入重定向的開始/結束符:<<EOF / >EOF
三、認識和使用tr命令:
tr–轉換和刪除字符
使用格式: tr[OPTION]...SET1 [SET2]
使用選項:-c或——complerment:取字符集的補集
-d或——delete:刪除所有屬於第一字符集的字符
-s或—squeeze-repeats:把連續重複的字符以單獨一個字符表示
-t或--truncate-set1:將第一個字符集對應字符轉化爲第二字符集對應的字符
tr –c使用:如下圖,將不是a和b的字母全部給轉換成n
四、管道:只能接收標準輸出,而不能接收錯誤輸出。
管道(使用符號“|”表示)用來連接命令;
命令1 | 命令2 | 命令3 | … :將命令1的STDOUT發送給命令2的STDIN,命令2的STDOUT發送到命令3的STDIN;
STDERR默認不能通過管道轉發,可利用2>&1 | 或|& 實現(無法判斷前面的COMMAND是否成功);
最後一個命令會在當前shell進程的子shell進程中執行用來;
1、組合多種工具的功能使用,如下:
eg: ls /etc/ | tr 'a-z' 'A-Z'
2、# who | tee | tr 'a-z' 'A-Z'
3、# ls-l/etc|less一頁一頁地查看輸入:
練習與作業:
1、 將/etc/issue文件中的內容轉換爲大寫後保存至/tmp/issue.out文件中
tr [[:lower:]] [[:upper:]] < /etc/issue >//tmp/issue.out
2、 將當前系統登錄用戶的信息轉換爲大寫後保存至/tmp/who.out文件中
# w | tr [[:lower:]] [[:upper:]] > /tmp/who.out
3、一個linux用戶給root發郵件,要求郵件標題爲”help”,郵件正文如下:Hello,I am 用戶名,the system version is here,pleasehelp me to check it ,thanks!
操作系統版本信息
mail help root <<EOF
<Hello, I am chesfer(`id -un`),the system version is here,pleasehelpme to check it ,thanks!
<`cat /etc/centos-release`
<EOF
4、將/root/下文件列表,顯示成一行,並文件名之間用空格隔開。
# ls/root/ | tr ‘\n’ ‘ ’
作業:
5、file1文件的內容爲:”1 2 34 5 6 7 8 9 10” 計算出所有數字的總和
# cat file1 |tr " " "+ " | bc
6、刪除Windows文本文件中的'^M'字符
#cat-A f11.ext
#dos2unix f11.txt
7、處理字符串“xt.,l 1jr#!$mn2 c*/fe3 uz4”,只保留其中的數字和空格
# catfiles | tr -d [[:alpha:]][[:punct:]]
8、將PATH變量每個目錄顯示在獨立的一行
#echo $PATH | tr ":" "\n"
9、刪除指定文件的空行
# #cat fs | tr -s [[:space:]]
10、將文件中每個單詞(字母)顯示在獨立的一行,並無空行
#cat fs | tr [[:space:]] '\n' | tr -s [[:space:]]
11、軟、硬鏈接區別
軟鏈接:兩個文件名擁有兩個不同的inode節點號;指向兩塊不同的數據塊;兩個文件名是一個“主 從”的關係;其中任何一個刪除,對另外的文件名沒有任何的影響;每增加一個文件名,inode節點號上的鏈接數增加一個,反之,刪除一個文件名,鏈接數減一,直至爲零,inode節點號和數據塊纔會被回收;鏈接的文件名數據塊上只是存放源文件名的訪問路徑;可以對目錄進行軟鏈接;可以跨分區創建鏈接;可以對不存在的文件名創建鏈接;鏈接方式上爲ln -s 源文件 鏈接名
硬鏈接:兩個/多個文件名只能擁有同一個inode節點號;指向同一塊的數據塊;兩個或多個文件名是一個“平等”的關係;其中任何的一個刪除掉,另外的一個雖然存在,但其指向的鏈接是一個無效的鏈接;不能夠對目錄進行鏈接;不能跨分區創建鏈接;不能夠對不存在的文件名創建鏈接;鏈接方式上爲ln 源文件 鏈接名