一,標準輸入輸出:
程序 : 指令+數據
程序 :IO
可用於輸入的設備:文件,鍵盤設備,文件系統上的常規文件,網卡等;
可用於輸出的設備:文件,顯示器,文件系統上的常規文件,網卡等,
程序的數據流有三種:
輸入的數據流:<-- 標準輸入(stdin),鍵盤
輸出的數據流: -->標準輸出(stdout),顯示器
錯誤輸出流: -->錯誤輸出(stderr), 顯示器
fd:file descriptor 文件描述符
Linux 給程序提供三種I/O設備:
標準輸入(STDIN):0 默認接受來自鍵盤的輸入
標準輸出(STDOUT):1 默認輸出到終端窗口
錯誤輸出(STDERR):2 默認輸出到終端窗口
IO重定向:改變默認位置
STDOUT和STDERR 可以被重定向到文件,支持的操作符號包括:
> 把STDOUT重定向到文件
2> 把STDERR重定向到文件
&> 把所有輸出重定向到文件
輸出重定向:>
特性:覆蓋輸出!(很危險)
特殊設備: /dev/null ##任何數據放到裏面都會丟棄
# set -C (僅對當前shell有效)
禁止覆蓋輸出已存在的對象
ls /etc > /tmp/out.txt #強制覆蓋輸出 >|
# set +C
關閉上述特性
ls /etc > /tmp/out.txt
ls /etc > /dev/sda //可能會幹掉你的硬盤數據
輸出重定向:>>
特性:追加輸出!
錯誤輸出流
2> : 覆蓋重定向錯誤輸出數據流
2>> : 追加重定向錯誤輸出數據流
標準輸出和錯誤輸出各自重定向至不同位置
COMMAND > /PATH/TO/FILE.OUT 2> /PATH/TO/ERRORFILE.OUT
合併正常和錯誤輸出流
&> 覆蓋重定向
&>> 追加重定向
COMMAND > /path/to/file.out 2> &1 (順序很重要)
COMMAND >> /path/to/file.out 2>> &1
find /etc -name passwd 2> /dev/null
():合併多個程序的STDOUT ( cal 2007 ; cal 2008 ) > all.txt
ls /etc >> /tmp/out.txt 2>&1
輸入重定向 < :
使用<來重定向標準輸入
某些命令能夠接受從文件中導入的STDIN:
# tr 'a-z' 'A-Z' < /etc/issue //該命令將issue文件中的小寫字母全部轉換爲大寫
tr –d abc < /etc/fstab 刪除fstab文件中的所有abc中任意字符
文檔終止詞 <<
使用 << 命令從鍵盤把多行重導向給STDIN,直到 終止詞 位置的所有文本都發給STDIN
tr命令:
tr[OPTION]... SET1 [SET2]:把輸入的數據當成字符,把set1的字符對位轉換set2的字符
### tr [a-z] [A-Z] < /etc/issue 把/etc/issue中的所有字符轉化爲大寫並輸出到屏幕上
tr -d '[A-Z]' < /etc/issue 把/etc/issue 中的大寫字母移除
Here Document: <<
cat << EOF
cat > /tmp/out.txt <<EOF
命令參數
-
-c或——complerment:取字符集的補集
-
-d或——delete:刪除所有屬於第一字符集的字符
-
-s或—squeeze-repeats:把連續重複的字符以單獨一個字符 表示
-
-t或--truncate-set1:將第一個字符集對應字符轉化爲第二 字符集對應的字符
管道:|
連接程序,實現將前一個命令的輸出直接定向後一個程序當作輸入數據流
STDERR默認不能通過管道轉發,可利用2>&1 或 |& 實現
tee命令:
#命令1 | tee 文件名 | 命令2
把命令1的STDOUT保存在文件名中,然後管道輸入給命令2
使用:
保存不同階段的輸出
複雜管道的故障排除
同時查看和記錄輸出
因此可以定向到多個目標,比如要在屏幕顯示,又要保存到磁盤,那麼
[root@localhost etc]# ls /etc/ | tee /tmp/out.txt | tr 'a-z' 'A-Z'
將command結果輸出到屏幕上,又保存了一份在磁盤上,由於tr名字在最後執行,因此結果如下
實戰訓練
1、將/etc/issue文件中的內容轉換爲大寫後保存至/tmp/issue.out文件中
cat /etc/issue | tr 'a-z' 'A-Z' > /tmp/issue.out
2、將當前系統登錄用戶的信息轉換爲大寫後保存至/tmp/who.out文件中
who | 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! 操作系統版本信息
mail -s "help" root <<eof
> Hello, I am $USER ,the system version is `cat /etc/centos-release`,please help me to check it ,thanks!
> eof
4、將/root/下文件列表,顯示成一行,並文件名之間用空格隔開
ls /root/ | tr '\n' ' '
5、file1文件的內容爲:”1 2 3 4 5 6 7 8 9 10” 計算出所有數字的總和
cat file1 | tr ' ' '+' | bc
6、刪除Windows文本文件中的'^M'字符
tr -d '\r' < 1.txt | tee 2.txt
7、處理字符串“xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4”,只保留其中的數字和空格
echo $"xt.,l 1 jr#-limn2 c*/fe3 uz4" | tr -d [:alpha:],[:punct:]
8、將PATH變量每個目錄顯示在獨立的一行
echo $PATH | tr ':' '\n
9、刪除指定文件的空行
cat lss | tr -s '\n'
10、將文件中每個單詞(字母)顯示在獨立的一行,並無空行
cat lss |tr ' ' '\n'| tr -s '\n'