標準I/O和管道

1 Linux給程序提供三種I/O設備
 標準輸入(STDIN)-0 默認接受來自鍵盤的輸入
 標準輸出(STDOUT)-1 默認輸出到終端窗口
 標準錯誤(STDERR)-2 默認輸出到終端窗口
 I/O重定向:改變默認位置
2 。重定向定義:將標準輸出和錯誤輸出改變其默認輸出設備
將標準輸出(STDOUT)標準錯誤(STDERR)可以被重定向到文件:
命令 操作符號 文件名
符號: > 把STDOUT重定向到文件
2> 把STDERR重定向到文件
&> 把所有輸出重定向到文件
實例:
1. > 把STDOUT重定向到文件
這裏寫圖片描述
結果:
這裏寫圖片描述
2. 2> 把STDERR重定向到文件
這裏寫圖片描述
Howareyou 並不能輸到pts/1 符號2>只能把錯誤信息輸到pts/1中,如下例:

這裏寫圖片描述
這裏寫圖片描述
3. &> 把所有輸出重定向到文件
3.1這裏寫圖片描述
這裏寫圖片描述
3.2
這裏寫圖片描述
這裏寫圖片描述

3:

文件內容會被覆蓋

set -C: 禁止將內容覆蓋已有文件,但可追加
這裏寫圖片描述

| file:強制覆蓋
這裏寫圖片描述
set +C: 允許覆蓋
這裏寫圖片描述
 >> 原有內容基礎上,追加內

這裏寫圖片描述

4 補充:創建文件方式:
這裏寫圖片描述
輸出重定向:一個命令的結果保存到另一個地方,不由顯示器顯示,可以輸入其他終端或者保存到文件中
5**把輸出和錯誤重新定向到文件**
2>: 覆蓋重定向錯誤輸出數據流
這裏寫圖片描述
2>>: 追加重定向錯誤輸出數據流
標準輸出和錯誤輸出各自定向至不同位置
這裏寫圖片描述
COMMAND > /path/to/file.out 2> /path/to/error.out
例子:
這裏寫圖片描述
 合併標準輸出和錯誤輸出爲同一個數據流進行重定向
 &> 覆蓋重定向
 &>> 追加重定向
 COMMAND > /path/to/file.out 2>&1 (順序很重要)
 COMMAND >> /path/to/file.out 2>&1
 ():合併多個程序的STDOUT
( cal 2007 ; cal 2008 ) > all.txt
這裏寫圖片描述
6 tr 轉換和刪除字符
 tr [OPTION]… SET1 [SET2]
 選項:
-c –C –complement:取字符集的補集

這裏寫圖片描述

-d –delete:刪除所有屬於第一字符集的字符
這裏寫圖片描述
-s –squeeze-repeats:把連續重複的字符以單獨一個字符表示
-t –truncate-set1:將第一個字符集對應字符轉化爲第二字符集
這裏寫圖片描述
對應的字符
 [:alnum:]:字母和數字 [:alpha:]:字母 [:cntrl:]:控制(非打印)字符
[:digit:]:數字 [:graph:]:圖形字符 [:lower:]:小寫字母 [:print:]:可打印字符
[:punct:]:標點符號 [:space:]:空白字符 [:upper:]:大寫字母 [:xdigit:]:十六進制字符

7.從文件中導入STDIN
 使用 < 來重定向標準輸入
這裏寫圖片描述
 某些命令能夠接受從文件中導入的STDIN
1 tr ‘a-z’ ‘A-Z’< /etc/issue
該命令會把/etc/issue中的小寫字符都轉換成寫寫字符
2  tr –d abc < /etc/fstab 刪除fstab文件中的所有abc中任意字符
3 cat > file (cat創建文件)
mage
wangxiaochun
按ctrl+d離開,可以使用文件來代替鍵盤的輸入
 Cat > filea < fileb
這裏寫圖片描述

重點來了——這裏寫圖片描述
1.發送普通文件:
這裏寫圖片描述
這裏寫圖片描述
把系統文件發送過來
這裏寫圖片描述
8*管道*
| 將正確結果重定向給下一條命令
2>&1 | 或 |& 全部結果重定向

mail: 通過電子郵件發送輸入
echo “test email” | mail -s “test” [email protected]
這裏寫圖片描述
 lpr:把輸入發送給打印機
echo “test print” | lpr -P printer_name

獲取boot目錄所在分區的可用空間
df -h |tr -s [:space:]|grep /boot |cut -d” ” -f5 |cut -d “%” -f1

獲取本機的IP地址
ifconfig ens34 |grep broadcast |tr -s ‘[:space:]’|cut -d ” ” -f3
9練習
1、 將/etc/issue文件中的內容轉換爲大寫後保存至/tmp/issue.out文件中
[root@localhost ~]# ls /etc/issue |tr ‘a-z’ ‘A-Z’ > /tmp/issue.out
2、將當前系統登錄用戶的信息轉換爲大寫後保存至/tmp/who.out文件中
[root@localhost ~]# who | tr ‘a-z’ ‘A-Z’ |tee -a /tmp/who.out
3、一個linux用戶給root發郵件,要求郵件標題爲”help”,郵件正文如下:
Hello, I am 用戶名,The system version is here,please help me to
check it ,thanks!
操作系統版本信息
[root@localhost ~]# echo -e ‘Hello,I am ‘$USR’ ,The system version is here ,please help me to chack it ,thanks!\n’ ‘uname -a ’ |mail -s “help” root
4、將/root/下文件列表,顯示成一行,並文件名之間用空格隔開
ls -1 |tr ‘\n’ ’ ’
5、計算1+2+3+..+99+100的總和
Aswer1:

#!/bin/bash
j=0
for ((i=0;i<=100;i++))
do
((j=j+i))
done
echo $j

Answer2:
echo {1..100} |tr ’ ’ ‘+’ |bc
6、刪除Windows文本文件中的‘^M’字符
cat win.txt |tr -d ‘^M’ > win1.txt

7、處理字符串 “xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4”,只保留其中的數字
和空格:

echo ‘“xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4”’ |tr -cd [:digit:][:space:]

8、將PATH變量每個目錄顯示在獨立的一行
echo $PATH |tr ‘:’ ‘\n’
9、將指定文件中0-9分別替代成a-j
# cat file | tr [0-9] [a-j] > new_file
10、將文件中每個單詞(由字母組成)顯示在獨立的一行,並無空行
cat /etc/fstab |tr -c [a-zA-Z] ‘\n’ |tr -s [:space:]

發佈了33 篇原創文章 · 獲贊 16 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章