linux基礎⑧-輸入與輸出

標準輸入輸出和錯誤輸出

一個程序運行起來最少會打開三個文件,分別是標準輸入(0)\標準輸出(1)\錯誤輸出(2)
三個文件都是fd(文件描述符)管理。

linux下使用標準輸入文件stdin和標準輸出文件stdout,來表示每個命令的輸入和輸出,還使用一個標準錯誤輸出文件stderr用於輸出錯誤信息。這三個標準輸入輸出系統缺省與控制終端設備相聯繫在一起。

因此,在標準情況下,每個命令通常從它的控制終端中獲取輸入,將輸出打印到控制終端的屏幕上。但是也可以重新定義程序的標準輸入文件stdin和標準輸出文件stdout,將它們重新定向。最基本的用法是將它們重新定義到一個文件上,從一個文件獲取輸入,輸出到另外的文件中等。標準輸入文件stdin,通常對應終端的鍵盤;標準輸出文件stdout和標準錯誤輸出文件stderr,這兩個文件都對應終端的屏幕。進程將從標準輸入文件中得到輸入數據,將正常輸出數據輸出到標準輸出文件,而將錯誤信息送到標準錯誤文件中。

文件描述符

文件描述符是從0開始的整數,指向與進程相關的特定數據流。當進程啓動時,通常打開三個文件描述符,分別對應三種標準的I/O:標準輸入(文件描述符0),標準輸出(文件描述符1),標準錯誤(文件描述符2)。

1)標準輸入(STDIN):它是命令的輸入,缺省和終端的鍵盤關聯

2)標準輸出(STDOUT):它是命令的輸出,缺省和終端的屏幕關聯

3)標準錯誤(STDERR):它是命令的錯誤信息輸出,缺省也和終端的屏幕關聯

4)如果進程打開了額外的文件進行輸入和輸出,則其被設置爲下一個可用的文件描述符,從3到9

文件重重定向

標準覆蓋輸出重定向 1> 將程序輸出的正確結果輸出到指定的文件中,會覆蓋文件原有的內容
標準追加輸出重定向 1>> 將程序輸出的正確結果以追加的方式輸出到指定文件,不會覆蓋原有文件
錯誤覆蓋輸出重定向 2> 將程序的錯誤結果輸出到執行的文件中,會覆蓋文件原有的內容
錯誤追加輸出重定向 2>> 將程序輸出的錯誤結果以追加的方式輸出到指定文件,不會覆蓋原有文件
標準輸入重定向 << 將命令中接收輸入的途徑由默認的鍵盤更改爲指定的文件或命令

實例

1.將正確的輸出和錯誤的輸出,分別打印到不同的文件中
su - lamp
find /etc/ > a.txt 2>b.txt

2.混合輸出,無論是正確的輸出還是錯誤的輸出都定向到一個文件中
$ find /etc/ &>abc
$ find /etc/ >aa.txt 2>&1 #

3.合併兩個文件,將兩個文件的輸出重新定向到一個新的文件中.
$ cat a.txt b.txt > c.txt

4.爲了避免錯誤的輸出大量顯示在屏幕產生干擾,可以直接丟棄,
$ find /etc/ >bbbb.txt #將正確的輸出寫入bbbb文件,錯誤的輸出直接輸出到屏幕
$ find /etc/ >bbbb.txt 2>/dev/null #正確的輸出寫入到bbbb文件,錯誤的直接丟棄
$ find /etc/ 2>/dev/null #正確的輸出到屏幕,錯誤的丟棄

5.[root@lsy~]# vim ping.sh
ping -W1 -c1 10.0.0.1
if [ $? -eq 0 ];then
echo “10.0.0.1 is up.”
else
echo “10.0.0.1 is down.”
fi
[root@lsy~]# chmod +x ping.sh
root@lsy~]# ./ping.sh

#改進後版,屏蔽掉ping命令產生所有輸出,無論正常還是異常,都不看
[root@lsy~]# vim ping.sh
ping -W1 -c1 10.0.0.1 &>/dev/null
if [ $? -eq 0 ];then
echo “10.0.0.1 is up.”
else
echo “10.0.0.1 is down.”
fi

#改進後版,將人爲定義的正確輸出和錯誤輸出定向到不同的文件中
[root@lsy~]# vim ping2.sh
ping -c1 10.0.0.1 &>/dev/null
if [ $? -eq 0 ];then
echo “10.0.0.1 is up.” >>up.txt
else
echo “10.0.0.1 is down.” >>down.txt
fi
[root@lsy~]# chmod +x ping2.sh
[root@lsy~]# ./ping2.sh #沒有+x 則bash ping2.sh

6.如何把程序放入後臺(screen)
(while :; do date; sleep 2; done) & #&表示將程序放置後臺
(while :; do date; sleep 2; done) &>date.txt &
表示執行的程序和&>date.txt 視爲一個命令, 然後將這一個命令使用&放置後臺

7.在子shell中運行程序
[root@lsy~]# cd /boot; ls #分號都執行,|前面成功才執行後面, ||失敗才執行後面
#subshell 中執行
[root@lsy~]# (cd /boot; ls)

8.將/etc/passwd 中的用戶按 UID 大小排序
[root@lsy~]# sort -t":" -k3 -n /etc/passwd
[root@lsy~]# sort -t":" -k3 -n /etc/passwd -r
[root@lsy~]# sort -t":" -k3 -n /etc/passwd |head

8.統計當前/etc/passwd 中用戶使用的 shell 類型
#思路:取出第七列(shell) | 排序(把相同歸類)| 去重
[root@lsy~]# awk -F: ‘{print $7}’ /etc/passwd
[root@lsy~]# awk -F: ‘{print $7}’ /etc/passwd |sort
[root@lsy~]# awk -F: ‘{print $7}’ /etc/passwd |sort |uniq
[root@lsy~]# awk -F: ‘{print $7}’ /etc/passwd |sort |uniq -c

9.統計網站的訪問情況 top 2
#思路: 打印所有訪問的連接 | 過濾訪問網站的連接 | 打印用戶的 IP | 排序 | 去重
[root@lsy~]# yum -y install httpd
[root@lsy~]# systemctl start httpd
[root@lsy~]# systemctl stop firewalld
[root@lsy~]# ss -an |grep :80 |awk -F":" ‘{print $8}’ |sort |uniq -c
[root@lsy~]# ss -an |grep :80 |awk -F":" ‘{print $8}’ |sort |uniq -c |sort -k1 -rn |head -n 20

10.打印當前所有 IP
[root@lsy~]# ip addr |grep 'inet ’ |awk ‘{print $2}’ |awk -F"/" ‘{print $1}’

11.打印根分區已用空間的百分比(僅打印數字)
[root@lsy~]# df |grep ‘/$’ |awk ‘{print $5}’ |awk -F"%" ‘{print $1}’
[root@lsy~]# ip addr |grep 'inet ’ |tee ip.txt |awk -F"/" ‘{print $1}’ |awk ‘{print $2}’

12.重定向與 tee 區別
[root@lsy~]# date > date.txt #直接將內容寫入date.txt文件中
[root@lsy~]# date |tee date.txt #命令執行會輸出至屏幕,但會同時保存一份至date.txt文件中

13.xargs參數傳遞,主要讓一些不支持管道的命令可以使用管道技術
which cat|xargs ls- l
ls |xargs rm -fv
ls |xargs cp -rvt /tmp/ -或-> ls | xargs -I {} cp -rv {} /tmp/ #t目標 源
ls |xargs mv -t /tmp/ -或-> ls | xargs -I {} mv {} /tmp

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章