day12重定向

1.什么是重定向?

將原本要輸出到屏幕的數(shù)據(jù)信息,重新定向到某個(gè)指定的文件中

2.為什么要使用重定向?

1.當(dāng)屏幕輸出的信息很重要,而且希望保存重要的信息時(shí);
2.后臺(tái)執(zhí)行中的程序,不希望他干擾屏幕正常的輸出結(jié)果時(shí);
3.系統(tǒng)的例行命令, 例如定時(shí)任務(wù)的執(zhí)行結(jié)果,希望可以存下來(lái)時(shí);
4.一些執(zhí)行命令,我們已經(jīng)知道他可能出現(xiàn)錯(cuò)誤信息, 想將他直接丟棄時(shí);
5.錯(cuò)誤日志與正確日志需要分別輸出至不同的文件保存時(shí)

3.學(xué)習(xí)重定向前需要了解的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、錯(cuò)誤輸出?
  • 當(dāng)運(yùn)行一個(gè)程序時(shí)通常會(huì)自動(dòng)打開(kāi)三個(gè)標(biāo)準(zhǔn)文件,分別是標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、錯(cuò)誤輸出
名稱(chēng) 文件描述符 作用
標(biāo)準(zhǔn)輸入 (SRDIN) 0 默認(rèn)是鍵盤(pán),也可以是文件或其他命令的輸出
標(biāo)準(zhǔn)輸出(STDOUT) 1 默認(rèn)輸出到屏幕。
錯(cuò)誤輸出(STDERR) 2 默認(rèn)輸出到屏幕
文件名稱(chēng) 3+
  • 進(jìn)程將從標(biāo)準(zhǔn)輸入中得到數(shù)據(jù),將正常輸出打印至屏幕終端,將錯(cuò)誤的輸出信息也打印至屏幕終端。
  • PS: 進(jìn)程是使用文件描述符(file descriptors)來(lái)管理打開(kāi)的文件


    11.png
4.重定向、追加重定向、案例演示?
  • 輸出重定向
類(lèi)型 操作符 用途
標(biāo)準(zhǔn)覆蓋輸出重定向 > 將程序輸出的正確結(jié)果輸出到指定的文件中,會(huì)覆蓋文件原有的內(nèi)容
標(biāo)準(zhǔn)追加輸出重定向 >> 將程序輸出的正確結(jié)果以追加的方式輸出到指定文件,不會(huì)覆蓋原有文件
錯(cuò)誤覆蓋輸出重定向 2> 將程序的錯(cuò)誤結(jié)果輸出到執(zhí)行的文件中,會(huì)覆蓋文件原有的內(nèi)容
錯(cuò)誤追加輸出重定向 2>> 將程序輸出的錯(cuò)誤結(jié)果以追加的方式輸出到指定文件,不會(huì)覆蓋原有文件
標(biāo)準(zhǔn)輸入重定向 << 將命令中接收輸入的途徑由默認(rèn)的鍵盤(pán)更改為指定的文件或命令
12.png
#標(biāo)準(zhǔn)輸出重定向, 先清空,后寫(xiě)入, 如果文件不存在則創(chuàng)建
[root@oldboy ~]# ifconfig eth0 > 1.txt
13.png
#標(biāo)準(zhǔn)追加輸出重定向, 向配置文件末尾追加內(nèi)容
[root@oldboy ~]# echo "abc123" >> 1.txt 
14.png
#正確輸出以及錯(cuò)誤輸出重定向至一個(gè)文件
[root@oldboy ~]# useradd whl
[root@oldboy ~]# su - whl 

[whl@oldboy ~]$ find /etc/ -name "*.conf" 1>a 2>b
#將標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出重定向到不同文件
15.png
#將標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出重定向到同一個(gè)文件, 混合輸出
[whl@oldboy ~]$ find /etc/ -name "*.conf" &>ab
#合并兩個(gè)文件內(nèi)容至一個(gè)文件
[whl@oldboy ~]$ cat a b >c
17.png
#重定向到相同的位置
[root@oldboy ~]# ls /root /error >ab  2>&1
16.png

將產(chǎn)生的任何數(shù)據(jù)放入黑洞設(shè)備,則視為丟棄。

[root@oldboy ~]# ls /root /error >ab 2>/dev/null
[root@oldboy ~]# ls /root /error >ab &>/dev/null
  • 輸入重定向

輸入重定向,即原本從鍵盤(pán)等上獲得的輸入信息,重定向由命令的輸出作為輸入

案例1: 從文件中讀入輸入的操作

#沒(méi)有改變輸入的方向,默認(rèn)鍵盤(pán)
[root@oldboy ~]# mail alice 
Subject: hello
1111 
2222
3333
.   #結(jié)束
EOT

#檢查是否收到郵件
[root@oldboy ~]# su - alice
[root@oldboy ~]# mail

#輸入重定向,來(lái)自于文件
[root@oldboy ~]# mail -s "test01" alice < /etc/hosts

案例2: 無(wú)法形容案例,請(qǐng)看實(shí)際操作

#沒(méi)有改變輸入的方向,默認(rèn)鍵盤(pán),此時(shí)等待輸入
[root@oldboy ~]# grep 'root' 
xxx
xxx
[root@oldboy ~]# grep 'root' < /etc/passwd
root:x:0:0:root:/root:/bin/bash 

案例3: 無(wú)法形容案例,請(qǐng)看實(shí)際操作

[root@oldboy ~]# dd if=/dev/zero of=/file1.txt bs=1M count=20
[root@oldboy ~]# dd </dev/zero >/file2.txt bs=1M count=20

案例4: mysql如何恢復(fù)備份,了解即可,不用關(guān)注。

[root@oldboy ~]# mysql -uroot -p123 < bbs.sql

案例5: 利用重定向建立多行數(shù)據(jù)的文件

#手動(dòng)執(zhí)行 shell 命令
[root@oldboy ~]# echo "111" > file1.txt 
[root@oldboy ~]# cat file1.txt
111
[root@oldboy ~]# cat >file2.txt
111
222
333
^D
[root@oldboy ~]# cat >>file3.txt
aaa
bbb
ccc
^D

案例6: 腳本中打印菜單的一種使用方法。

[root@oldboy ~]# vim vm.sh
cat <<-EOF
+-------------------------------+ ||
| ====================== | 
| 虛擬機(jī)基本管理 v5.0 |
| by xuliangwei |
| ====================== | 
| 1. 安裝 KVM |
| 2. 安裝或重置 CentOS-6.9 | 
| 3. 安裝或重置 CentOS-7.4 | 
| 5. 安裝或重置 Windows-7  | 
| 6. 刪除所有虛擬機(jī) |
| q. 退出管理程序 |
+------------------------------+ 
EOF

案例7: 兩條命令同時(shí)重定向

[root@oldboy ~]# ls; date &>/dev/null
[root@oldboy ~]# ls &>/dev/null; date &>/dev/null
[root@oldboy ~]# (ls; date) &>/dev/null
#后臺(tái)執(zhí)行
[root@oldboy ~]# (while :; do date; sleep 2; done) &
[1] 6378
[root@oldboy ~]# (while :; do date; sleep 2; done) &>date.txt &
[root@oldboy ~]# jobs
[1]+ 運(yùn)行中 ( while :; do date; sleep 2; done ) &>/date.txt &

擴(kuò)展點(diǎn): subshell 了解即可

[root@oldboy ~]# cd /boot; ls
//subshell 中執(zhí)行
[root@oldboy ~]# (cd /boot; ls)
#如果不希望某些命令的執(zhí)行對(duì)當(dāng)前 shell 環(huán)境產(chǎn)生影響,請(qǐng)?jiān)趕ubshell中執(zhí)行
5.進(jìn)程管道技術(shù)是什么?
  • 1.什么是管道

管道操作符號(hào) "|" ,主要用來(lái)連接左右兩個(gè)命令, 將左側(cè)的命令的標(biāo)準(zhǔn)輸出, 交給右側(cè)命令的標(biāo)準(zhǔn)輸入
PS: 無(wú)法傳遞標(biāo)準(zhǔn)錯(cuò)誤輸出至后者命令

  • 2.管道流程示意圖


    18.png

格式: cmd1 | cmd2 [...|cmdn]

  • 管道使用案例
    案例1: 將/etc/passwd 中的用戶(hù)按 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)計(jì)當(dāng)前/etc/passwd 中用戶(hù)使用的 shell 類(lèi)型

#思路:取出第七列(shell) | 排序(把相同歸類(lèi))| 去重
[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

案例4: 統(tǒng)計(jì)網(wǎng)站的訪(fǎng)問(wèn)情況 top 20

#思路: 打印所有訪(fǎng)問(wèn)的連接 | 過(guò)濾訪(fǎng)問(wèn)網(wǎng)站的連接 | 打印用戶(hù)的 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

案例5: 打印當(dāng)前所有 IP

[root@oldboy ~]# ip addr |grep 'inet ' |awk '{print $2}' |awk -F"/" '{print $1}'
127.0.0.1
192.168.69.112

案例6: 打印根分區(qū)已用空間的百分比(僅打印數(shù)字)

[root@oldboy ~]# df |grep '/$' |awk '{print $5}' |awk -F"%" '{print $1}'

PS: 管道命令符能讓大家能進(jìn)一步掌握命令之間的搭配使用方法,進(jìn)一步提高命令輸出值的處理效率。

  • 管道中的tee技術(shù)


    19.png
#選項(xiàng): -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 有他們?cè)谑褂眠^(guò)程中有什么區(qū)別

[root@oldboy ~]# date > date.txt    #直接將內(nèi)容寫(xiě)入date.txt文件中
[root@oldboy ~]# date |tee date.txt #命令執(zhí)行會(huì)輸出至屏幕,但會(huì)同時(shí)保存一份至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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.什么是重定向?2.為什么要使用重定向?3.學(xué)習(xí)重定向前需要了解的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、錯(cuò)誤輸出4.重定向、追加重...
    Demon_7636閱讀 500評(píng)論 0 0
  • 重定向概述 1.什么是重定向 將原本要輸出到屏幕的數(shù)據(jù)信息,重新定向到某個(gè)指定的文件中 2.為什么要使用重定向? ...
    人氣昂閱讀 544評(píng)論 0 0
  • 今日內(nèi)容大綱 什么是重定向? 為什么要使用重定向? 學(xué)習(xí)重定向前需要了解的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、錯(cuò)誤輸出? 重定向、...
    JoinMyTeam閱讀 293評(píng)論 0 2
  • 1.重定向概述 什么是重定向?qū)⒃疽敵龅狡聊坏臄?shù)據(jù)信息,重新定向到某個(gè)指定的文件中。比如:每天凌晨定時(shí)備份數(shù)據(jù),...
    不懂helloword閱讀 225評(píng)論 0 0
  • 今日總結(jié) 一、重定向概述 1.什么事重定向?將原本要輸出到屏幕的信息輸出到指定的文件。2.為何要使用重定向? 1....
    so_q閱讀 199評(píng)論 0 0

友情鏈接更多精彩內(nèi)容