歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux技術

linux重定向和管道的使用

bash的I/O重定向及管道
程序是由程序+指令組成;或者是數據結構+算法
程序數據來自哪裡,處理的結果又存放於哪裡?
程序必須能夠讀入輸出然後經過加工來產生結果;程序獲取的數據可以使數據也可以hi變量、數據、列表文件等等,程序生產出來的結果可以是變量、數據、列表、文件等。也就是說,程序都有讀入數據和輸入數據的需求。
讀入數據:Input
輸出數據:Output
通常對於程序來說,輸入輸出數據可以是鍵盤、鼠標、顯示器等;當然有時候輸入的數據是程序自身內部所具有的,但我們認為這些數據應該是通過外部輸入的,同樣,輸出的數據也有顯示器或文件,因此我們多了一個選擇,到底是從哪裡輸入數據,產生的數據又存放在那裡。因此就應該有一種缺省的定義,指認默認的輸入輸出途徑,當程序不指從哪裡輸入,輸出到那兒,默認的途徑就是進行數據交換。
一般缺省的輸入我們稱之為:標准輸入,缺省的輸出稱之為:標准輸出。
標准輸入:鍵盤
標准輸出:顯示器
打開的文件都有一個fd:file descriptor(文件描述符)
linux給程序提供三I/O設備
標准輸入(STDIN) 0 默認接受來自鍵盤的輸入
標准輸出(STDOUT) 1 默認輸出到終端窗口
標准錯誤(STDERR) 2 默認輸出到終端窗口
I/O重定向:改變標准位置
STDOUT和STDERR可以被重定向到文件:
命令 操作符號 文件名
ls /etc/ > /tmp/1.out
支持的操作符號包括以下幾種:
> 把STDOUT重定向到文件
2> 把STDERR重定向到文件
&> 把所有輸出重定向到文件



當我查看/etc/issue文件時,不將文件的內容輸出到屏幕而是將文件內容重定向到/tmp/1.out文件當中,當我列出/root目錄下面不存在的文件時,本應該會提示文件不存在的信息,利用“2>”將報錯信息重定向到/tmp/2.out,&符號是將正確的信息和錯誤的信息一起重定向到某個文件。
當我想再次使用>時,第一次重定向的文件將會被覆蓋,使用“>>”追加符號,會將正確的輸出追加到文件裡,這是我們可以使用set -C禁止將內容覆蓋已有文件,但可追加強制覆蓋:>|,如果想再次開啟覆蓋重定向只需要set + C即可。
>>在原有內容的基礎之上,追加新內容
2>>追加重定向錯誤輸出數據流
標准輸出和錯誤輸出各自定向到不同的位置
command > /path/to/file.out 2>/path/to/error.out
合並標准輸出和錯誤輸出為同一個數據流進行重定向:
&>:覆蓋重定向,將正確和錯誤信息一同覆蓋輸入到同一個文件
&>>:追加重定向,將正確和錯誤信息一同追加到原有內容的後面
command >/path/to/file.out 2>&1執行某條命令後將錯誤的信息當成正確的信息重定向到文件
command >> /path/to/fileout 2>>&1跟上面類似,只不過是追加輸出內容到文件
():合並多個程序的STDOUT
(ls /etc/issue;cat /etc/passwd )> all.out
tr命令
tr [OPTION]... SET1 [SET2]
-c或--complerment:取字符集的補集
-d或--delete:刪除所有屬於第一字符集的字符
-s或--squeeze-repeats:把連續重復的字符以單獨一個字符表示
-t或--truncate-set1:將第一個字符集對應字符轉化為字符集對應的字符






從文件中導入STDIN
使用<來重定向到標准輸入
某些命令能夠接受從文件導入的STDIN:
tr 'a-z' 'A-Z' < /etc/issue



這個命令是將/etc/issue文件裡面的內容裡的小寫字符全部替換成大寫字符
tr -d abcd </etc/fstab 刪除fstab文件的所有abc中任意字符



<<EOF標准輸入,EOF是起始符(這個EOF是而已隨意起名的,但是必須得保證結束符號也用相同的字符),按回車之後等待鍵盤輸入內容,輸入完內容之後同樣 以EOF結尾哦結束符來結束交互並且將標准入的內容又重定向到文件中去
舉個例子發個郵件給hadoop
mail -s “good” hadoop <<END
>how are you ?
>my name is `id -nu`
>my hostname is `hostname`
>END
管道
前一個命令的輸出作為後一個命令的輸入
command1|command2|command3
將命令1的STDOUT發送給命令2的STDIN,命令2的STDOUT發送到命令3的STDIN
STDERR默認是不能通過管道轉發哦,但是可以利用2>&1或|&實現
最後一個命令會在當前shell進程的子進程中用來執行
組合多種工具的功能
ls |tr 'a-z ' 'A-Z'



管道的應用
less:一頁一頁的查看輸入
ls -l /etc/|less
mail:通過電子郵件發送輸入:
echo " test site " |mail -s "test" [email protected]
重定向到多個目標(tee)
command1 |tree filename |command2
把命令1的STDOUT保存在文件名中,然後管道輸入給命令2



使用:
保存不同階段的輸出
復雜管道的故障排除
同時查看和記錄輸出
練習題
1、將/etc/issue文件中的內容轉換為大寫後保存至/tmp/issue.out文件中
tr 'a-z' 'A-Z' </etc/issue > /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 `id -nu` ,the system version is here,please help me to
>check it ,thanks!
>`cat /etc/centos-release`
>EOF
4、將/root/下文件列表,顯示成一行,並文件名之間用空格隔開
ls /root/ |tr '\n' ' '
5、file1文件的內容為:”1 2 3 4 5 6 7 8 9 10” 計算出所有數字的總和
cat 1.file |xargs -n1 |echo $[ $(tr '[[:space:]]'+' ) 0 ]
6、刪除Windows文本文件中的'^M'字符
cat /root/1.txt|tr -d '\r' ' '
7、處理字符串“xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4”,只保留其中的數字和空格
tr -d -c ‘[[[:space:]][[:digit:]]' <“xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4"
8、將PATH變量每個目錄顯示在獨立的一行
echo $PATH|tr ':' '\n'
9、刪除指定文件的空行
tr -s '\n' << inittab
10、將文件中每個單詞(字母)顯示在獨立的一行,並無空行
tr -d '[[:space:]] << /etc/inittab
本文出自 “10122713” 博客,請務必保留此出處http://10132713.blog.51cto.com/10122713/1831888
Copyright © Linux教程網 All Rights Reserved