IO重定向及管道linux
一直都提到,程序:指令+數據shell
其實程序也有IO,數據的來源有多個地方:文件、外部centos
可用於輸入的設備:文件(linux一切皆文件)bash
鍵盤設備、文件系統上的常規文件加載內容、網卡等;ide
可用於輸出的設備:文件(linux一切皆文件)centos7
顯示器、文件系統上的常規文件輸出保存、網卡等;spa
程序的數據流有三種:ip
輸入的數據流;<-- 標準輸入(stdin),是鍵盤;文檔
輸出的數據流:--> 標準輸出(stdout),顯示器;it
錯誤輸出流: --> 錯誤輸出(stderr),顯示器;
fd: file descriptor,文件描述符;所對應標識符以下:
標準輸入:0
標準輸出:1
錯誤輸出:2
IO重定向:
輸出重定向:>
特性:覆蓋輸出,將anaconda-ks.cfg文件內容覆蓋到kk.txt中
[root@test7_1 ~]# cat anaconda-ks.cfg > kk.txt
輸出重定向:>>
特性:追加輸出,從文件尾部加入
[root@test7_1 ~]# cat anaconda-ks.cfg >> kk.txt
錯誤輸出流重定向:2>,2>>(追加)
[root@test7_1 sh]# cat test.txt 2> error.log
[root@test7_1 sh]# cat error.log
cat: test.txt: No such file or directory
[root@test7_1 sh]# cat test.log 2>> error.log
[root@test7_1 sh]# cat error.log
cat: test.txt: No such file or directory
cat: test.log: No such file or directory
合併正常輸出流和錯誤輸出流:
合併輸出流也是有覆蓋和追加兩種方式:
(1) &>, &>>
(2) COMMAND > /path/to/somefile 2>&1
COMMAND >> /path/to/somefile 2>&1
[root@centos7 tmp]# cat /root/anaconda-ks.cfg >> an.cfg 2>&1
註解:查看anaconda-ks.cfg文件內容追加到an.cfg中,若有錯誤輸出也將追加到an.cfg文 件中;
提一下特殊設備:/dev/null
此特殊設備理解爲「數據黑洞」,全部的數據扔進去就會被刪除
set爲shell內部命令,能夠設置禁止覆蓋輸出重定向至已存在文件;(Centos 6)
[root@test1 ~]# set -C
[root@test1 ~]# cat fstab > issue
-bash: issue: cannot overwrite existing file
若是將開啓後沒法使用重定向功能,此時可以使用強制覆蓋輸出:>|:
[root@test1 ~]# cat fstab >| issue
關閉上述特性:
[root@test1 ~]# set +C
注:set設定只對當前shell生效
輸入重定向:<
輸入重定向就是將「數據」做爲命令的數據輸入源,從而對數據作一些操做
先來一個命令:
tr命令:
tr - translate or delete characters
格式:
tr [OPTION]... SET1 [SET2]
把輸入的數據當中的字符,凡是在SET1定義範圍內出現的,統統一一對位轉換爲 SET2出現的字符
選項:
-d:刪除字符集合
示例1:
tr SET1 SET2 < /PATH/FROM/SOMEFILE
[root@test7_1 sh]# tr S s < ./issue
\s
Kernel \r on an \m
註解:將issue中出現全部大寫S,轉換成小寫s
示例2:
tr -d SET1 < /PATH/FROM/SOMEFILE
[root@test7_1 sh]# tr -d S < ./issue
\
Kernel \r on an \m
注意:不修改原文件
Here Document(此處建立文檔):<<
結束符操做兩種方式:
cat << EOF
cat > /PATH/TO/SOMEFILE << EOF
示例:
[root@test7_1 sh]# cat << EOF
> hello
> EOF
hello
解釋:
EOF爲結束符,當輸入的內容中有EOF時會退出
管道:
鏈接程序做用,實現將前一個命令的輸出直接定向後一個程序當作輸入數據流
能夠多級鏈接:
COMMAND1 | COMMAND2 | COMMAND3 | ...
管道符號: |
[root@test7_1 sh]# cat /etc/issue | tr COS cos
tee命令:
雙向管道,意思是輸入數據流保留並在次向後一個程序當作輸入數據流
格式:
COMMAND | tee /PATH/TO/SOMEFILE
示例:
[root@test1 ~]# cat /etc/issue | tee kkk | tr -d '6.4'
CentOS release (Final)
Kernel \r on an \m
[root@test1 ~]# cat kkk
CentOS release 6.4 (Final)
Kernel \r on an \m
練習1:把/etc/passwd文件的前6行的信息轉換爲大寫字符後輸出;
[root@test1 ~]# head -n 6 /etc/passwd | tr 'a-z' 'A-Z'