輸入輸出重定向、管道
1.文件描述符:
FD: 內核用來追蹤在內存中已經打開的文件的屬性(標識),是一個內存結構,
需要空間來存放此信息
2.標準輸入輸出
INPUT : 標準輸入: stdin , 描述符 : 0
OUPUT: 標準輸出: stdout 1
錯誤輸出 : stderr 2
3. I/O 重定向
1). 輸入重定向 : < (輸入沒有覆蓋的概念)
<< [EOF封裝]: 此處創建文件
常用於在腳本中創建文件或者生成菜單
eg: #生成菜單
cat << EOF
a: show a
b: show b
c: show c
EOF
--------> a: show a
b: show b
c: show c
#把腳本生成的信息輸出生成一個文檔
cat 》 /path to file.txt << EOF
a: show a
b: show b
c: show c
EOF
2).輸出重定向 : > (覆蓋輸出) >> (追加輸出,不覆蓋原內容)
3). 強制覆蓋重定向輸出: >|
4). 錯誤重定向 : 2> (覆蓋輸出) , 2>>(追加輸出)
5).全部信息重定向 :合併標準輸出和錯誤輸出爲同一個數據流進行重定向
&> : (正確和錯誤信息都定向)
等效於 cmd > /path 2>&1
&>>:追加重定向
6).支持同時重定向標準的正確和錯誤輸出 :
cmd > /path to 1 2> /path to 2 (分別把正確、錯誤信息輸出到指定文件)
7). ( ):合併多個程序的STDOUT (用;分號分割)
( cal 2007 ; cal 2008 ) > all.txt
8). 多行重定向: 用<<eof ..... eof 封裝
eg: cat f1 <<eof
kdkdk
kdkdk
eof (必須是獨立的一行,不可以有空格等)
------》實現重定向
9).禁止使用覆蓋重定向特性 : set -C
回覆特性: set +C
強制覆蓋重定向輸出: >| (在已經設置禁止覆蓋時強制覆蓋重定向)
注意: 輸出重定向只能用於正常的輸出,無法用於錯誤輸出
10)./dev/null bit bucket :位桶 ,用於丟棄任何輸入到其中的數據
11).命令執行狀態結果: 使用 $?
執行正確: 0 錯誤:非零值
自定義退出:
exit [n]
4. 管道: 類似輸出重定向的特殊實現,可以實現多重使用
1) .管道(使用符號“ |”表示)用來連接命令
命令1 | 命令2 | 命令3 | …
將命令1的STDOUT發送給命令2的STDIN,命令2的
STDOUT發送到命令3的STDIN
STDERR默認不能通過管道轉發,可利用2>&1 或 |& 實現
最後一個命令會在當前shell進程的子shell進程中執行用來
注意: 無法傳遞前面命令生成的變量並傳遞到最後的命令中,最後的命令是在子
shell中運行,已經不處於前面生成變量的作用範圍
STDERR默認不能通過管道轉發,可利用2>&1 或 |& 實現
2). 管道中實現即輸出到顯示端又輸出到後續命令的實現: T 管道
命令 tee
用法: 緊跟在需要做雙向輸出的命令後面
eg: cat /file | tee /tmp/abcd | wc -l #顯示file的內容並且放在/tmp/abcd文
件中,同時輸出給wc命令 顯示行數
3. tr : 轉換 或者 刪除
格式: tr [option] SET1 [SET2]
-c 補集 (除了匹配內容之外的內容)
-d 刪除符合SET1中的字符
-s 壓縮 ,將重複的字符壓縮爲一個字符顯示
-t 當對應轉換時,後面字符組位數比前面小時,只轉換後面字符組對應的位數,
多出的不管
\t 水平的tab
\v 垂直的tab 可以實現階梯狀
對應轉換: ‘abcd’ 'efgh'
a->e b->f 以此類推
‘abcd’'efg'
(注意 :當後面的字符位數不足時,把最後的g作爲前面d的轉換對象)
習慣上>後面接的是文件,| 後面是跟着命令,若是>後面跟着命令,有可能會把命令當做文件名.
練習:
1、將/etc/issue文件中的內容轉換爲大寫後保存至/tmp/issue.out文件中
cat /etc/issue | tr "a-z" "A-Z" > /tmp/issue.out
2、將當前系統登錄用戶的信息轉換爲大寫後保存至/tmp/who.out文件中
whoami | tr "a-z" "A-Z" > /tmp/who.out
3、一個linux用戶給root發郵件,要求郵件標題爲”help”,郵件正文如下:
Hello, I am 用戶名,the system version is here,please help me to
check it ,thanks!
操作系統版本信息
echo -e "Hello, i am `whoami` ,the system version is here,please help me to check it ,thanks! \n
`lsb_release`" > mail -s "help" liux
4、將/root/下文件列表,顯示成一行,並文件名之間用空格隔開。
ls -m /root | tr , \b
或者: ls /root | tr '\n' ' '
5、 file1文件的內容爲: ”1 2 3 4 5 6 7 8 9 10” 計算出所有數字的總和
echo "1 2 34 5 6 7 8 9 10" > file1
echo $[cat file1 | tr ' ' '+']
6、刪除Windows文本文件中的'^M'字符
cat a.txt | tr -d '\r' (windows 中,文件中換行會顯示爲^M)
7、處理字符串“ xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4”,只保留其中的數字
和空格
echo 'xt.,l 1 jr#!$mn2 c*/fe3 uz4' | tr -cd '[:digit:] \n'
8、將PATH變量每個目錄顯示在獨立的一行
echo $PATH | tr : '\n'
9、刪除指定文件中重複的空行
cat file | tr -s '\n'
10、將文件中每個單詞(字母)顯示在獨立的一行,並無空行
tr -cs '[:alpha:]' '\n'