1.重定向概述
1.什么是重定向
將原本要輸出到屏幕的數(shù)據(jù)信息,重新定向到某個指定的文件中。-
2.為什么要使用重定向
- 1.當屏幕輸出的信息很重要,而且希望保存重要的信息時;
2.后臺執(zhí)行中的程序,不希望他干擾屏幕正常的輸出結(jié)果時;
3.系統(tǒng)的例行命令, 例如定時任務的執(zhí)行結(jié)果,希望可以存下來時;
4.一些執(zhí)行命令,我們已經(jīng)知道他可能出現(xiàn)錯誤信息, 想將他直接丟棄時;
5.錯誤日志與正確日志需要分別輸出至不同的文件保存時;*
- 1.當屏幕輸出的信息很重要,而且希望保存重要的信息時;
3.學習重定向的預備知識,標準輸入與輸出
*當運行一個程序時通常會自動打開三個標準文件,分別是標準輸入、標準輸出、錯誤輸出
| 名稱 | 文件描述符 | 作用 |
|---|---|---|
| 標準輸入(STDIN) | 0 | 默認是鍵盤,也可以是文件或其他命令的輸出。 |
| 標準輸出(STDOUT) | 1 | 默認輸出到屏幕。 |
| 錯誤輸出(STDERR) | 2 | 默認輸出到屏幕。 |
| 文件名稱(filename) | 3+ |
- 進程將從標準輸入中得到數(shù)據(jù),將正常輸出打印至屏幕終端,將錯誤的輸出信息也打印至屏幕終端。
PS: 進程是使用文件描述符(file descriptors)來管理打開的文件

- 以 cat 命令為例, cat 命令的功能是從命令行給出的文件中讀取數(shù)據(jù),并將這些數(shù)據(jù)直接送到標準輸出。若使用如下命令:
#會把文件/etc/passwd的內(nèi)容輸出顯示到屏幕上
[root@oldboy ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
- 但如果 使用 cat 命令沒有跟上輸入的文件名,那么cat命令則會通過命令行標準輸入中讀取數(shù)據(jù), 并將其送到標準輸出。
[root@oldboy ~]# cat
wang
wang
wang
wang
^C
#用戶輸入的每一行都立刻被cat命令輸出到屏幕上。
- 標準輸入輸出過程
#持續(xù)追蹤查看文件內(nèi)容
[root@oldboy ~]# tail -f /etc/passwd
ctrl+z 將進程轉(zhuǎn)到后臺
#查看運行的進程
[root@oldboy ~]# ps
PID TTY TIME CMD
7776 pts/0 00:00:00 bash
7811 pts/0 00:00:00 cat
7816 pts/0 00:00:00 ps
* 查看tail命令的pid,7811進程下的文件描述符
[root@oldboy ~]# ls -l /proc/7811/fd
total 0
lrwx------. 1 root root 64 Aug 9 16:05 0 -> /dev/pts/0
lrwx------. 1 root root 64 Aug 9 16:05 1 -> /dev/pts/0
lrwx------. 1 root root 64 Aug 9 16:04 2 -> /dev/pts/0
Linux查看標準輸入輸出設(shè)備
[root@wyq ~]# ls -l /dev/std ---首先要進行掛載
- 2.輸出重定向
輸出重定向,改變輸出內(nèi)容的位置。輸出重定向有如下幾種方式
| 類型 | 操作符 | 用途 |
|---|---|---|
| 標準覆蓋輸出重定向 | > | 將程序輸出的正確結(jié)果輸出到指定的文件中,會覆蓋文件原有的內(nèi)容 |
| 標準追加輸出重定向 | >> | 將程序輸出的正確結(jié)果以追加的方式輸出到指定文件,不會覆蓋原有文件 |
| 錯誤覆蓋輸出重定向 | 2> | 將程序的錯誤結(jié)果輸出到執(zhí)行的文件中,會覆蓋文件原有的內(nèi)容 |
| 錯誤追加輸出重定向 | 2>> | 將程序輸出的錯誤結(jié)果以追加的方式輸出到指定文件,不會覆蓋原有文件 |
| 標準輸入重定向 | << | 將命令中接收輸入的途徑由默認的鍵盤更改為指定的文件或命令 |
案例1: 標準輸出重定向(每次都會覆蓋文件)

#標準輸出重定向, 先清空,后寫入, wsd默認創(chuàng)建成功
[root@oldboy ~]# ifconfig ens33 >wsd
- 例2: 標準輸出重定向(會往文件的尾部在添加內(nèi)容)

#標準追加輸出重定向, 向配置文件末尾追加內(nèi)容
[root@oldboy ~]# echo "I am a students" >> qwe
[root@oldboy ~]# cat qwe
I am a students
- 例3: 錯誤輸出重定向

* 正確輸出以及錯誤輸出重定向至一個文件
[root@oldboy ~]# useradd xiaokeai
[root@oldboy ~]# su xiaokeai
[xiaokeai@oldboy root]$
#將標準輸出和標準錯誤輸出重定向到不同文件
find /etc -name "*.conf" 1>a 2>b
-
例4: 正確和錯誤都輸入到相同位置
#將標準輸出和標準錯誤輸出重定向到同一個文件, 混合輸出
find /etc -name "*.conf" &>ab
#合并兩個文件內(nèi)容至一個文件
[xiaokeai@oldboy root]$ cat a b > c
-
例5: 正確和錯誤都輸入到相同位置
#重定向到相同的位置
[root@oldboy ~]# ls /root /error >ab 2>&1
- 例6: 重定向到空設(shè)備/dev/null (黑洞設(shè)備,只進不出,相當于垃圾桶)

* 將產(chǎn)生的任何數(shù)據(jù)放入黑洞設(shè)備,則視為丟棄。
[root@oldboy ~]# ls /root /error >ab 2>/dev/null
[root@oldboy ~]# ls /root /error >ab &>/dev/null
- 3.輸入重定向
*輸入重定向,即原本從鍵盤等上獲得的輸入信息,重定向由命令的輸出作為輸入。< 等價 0<
- 案例1: 從文件中讀入輸入的操作
#沒有改變輸入的方向,默認鍵盤
[root@oldboy ~]# mail xiaokeai
Subject: nihao
qwe
qwe
122
.
EOT
#檢查是否收到郵件
[root@oldboy ~]# su - xiaokeai
[xiaokeai@oldboy ~]# mail
[xiaokeai@oldboy ~]$ mail
Heirloom Mail version 12.5 7/5/10. Type ? for help.
"/var/spool/mail/xiaokeai": 1 message 1 new
>N 1 root Fri Aug 9 16:25 20/602 "nih"
#輸入重定向,來自于文件
[root@oldboy ~]# mail -s "test01" alice < /etc/hosts
- 案例2: 無法形容案例
#沒有改變輸入的方向,默認鍵盤,此時等待輸入
[root@oldboy ~]# grep 'root'
www
yyy
[root@oldboy ~]# grep 'root' </etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
* 例3: 兩條命令同時重定向
[root@oldboy ~]# ls;date &>/dev/null
1.txt abc file_i t.txy w0022 wsd z0022
ab anaconda-ks.cfg qwe w000 wang_a z000
[root@oldboy ~]# ls &>/dev/null; date &>/dev/null
[root@oldboy ~]# (ls; date) &>/dev/null
#后臺執(zhí)行
[root@oldboy ~]# (while :; do date; sleep 2; done) &
[1] 7854
4.進程管道技術(shù)
- 1.什么是管道
- 管道操作符號 "|" ,主要用來連接左右兩個命令, 將左側(cè)的命令的標準輸出, 交給右側(cè)命令的標準輸入
PS: 無法傳遞標準錯誤輸出至后者命令*
2.管道流程示意圖

- 3.管道使用案例
- 案例1: 將/etc/passwd 中的用戶按 UID 大小排序*
[root@oldboy ~]# sort -t":" -k3 -n /etc/passwd
[root@oldboy ~]# sort -t":" -k3 -n /etc/passwd -r
[root@oldboy ~]# sort -t":" -k3 -n /etc/passwd |head
- 案例2: 統(tǒng)計當前/etc/passwd 中用戶使用的 shell 類型
#思路:取出第七列(shell) | 排序(把相同歸類)| 去重
[root@oldboy ~]# awk -F: '{print $7}' /etc/passwd
[root@oldboy ~]# awk -F: '{print $7}' /etc/passwd |sort
[root@oldboy ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq
[root@oldboy ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq -c
- 案例3: 統(tǒng)計網(wǎng)站的訪問情況 top 20*
#思路: 打印所有訪問的連接 | 過濾訪問網(wǎng)站的連接 | 打印用戶的 IP | 排序 | 去重
[root@oldboy ~]# yum -y install httpd
[root@oldboy ~]# systemctl start httpd
[root@oldboy ~]# systemctl stop firewalld
[root@oldboy ~]# ss -an |grep :80 |awk -F":" '{print $8}' |sort |uniq -c
[root@oldboy ~]]# ss -an |grep :80 |awk -F":" '{print $8}' |sort |uniq -c |sort -k1 -rn |head -n 20
- 案例4: 打印當前所有 IP
[root@xuliangwei ~]# ip addr |grep 'inet ' |awk '{print $2}' |awk -F"/" '{print $1}'
127.0.0.1
192.168.69.112
- 4.管道中的tee技術(shù)

#選項: -a追加
[root@oldboy ~]# ip addr |grep 'inet ' |tee ip.txt |awk -F"/" '{print $1}' |awk '{print $2}'
127.0.0.1
10.0.0.100
[root@oldboy ~]# cat ip.txt
inet 127.0.0.1/8 scope host lo
inet 10.0.0.100/24 brd 192.168.69.255 scope global ens32
- 重定向與 tee 有他們在使用過程中有什么區(qū)別
[root@oldboy ~]# date > date.txt #直接將內(nèi)容寫入date.txt文件中
[root@oldboy ~]# date |tee date.txt #命令執(zhí)行會輸出至屏幕,但會同時保存一份至date.txt文件中
- 5.xargs參數(shù)傳遞,主要讓一些不支持管道的命令可以使用管道技術(shù)
# which cat|xargs ls- l
# ls |xargs rm -fv
# ls |xargs cp -rvt /tmp/ -或-> ls | xargs -I {} cp -rv {} /tmp/
# ls |xargs mv -t /tmp/ -或-> ls | xargs -I {} mv {} /tmp

