Linux重定向day13

1.重定向概述
2.重定向的輸出輸入
3.進(jìn)程管道技術(shù)


一、重定向概述


  • 什么是重定向:
    Linux重定向是指修改原來(lái)默認(rèn)的一些東西,對(duì)原來(lái)系統(tǒng)命令的默認(rèn)執(zhí)行方式進(jìn)行改變,比如說(shuō)
    簡(jiǎn)單的我不想看到在顯示器的輸出而是希望輸出到某一文件中就可以通過(guò)重定向來(lái)進(jìn)行這項(xiàng)工作。

  • 為何使用重定向:
    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í);

二、重定向的輸出輸入


一個(gè)程序運(yùn)行時(shí)通常會(huì)自動(dòng)打開(kāi)三個(gè)標(biāo)準(zhǔn)文件,分別是標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出

名稱 文件描述符 作用
標(biāo)準(zhǔn)輸入(STDIN) 0 默認(rèn)是鍵盤(pán),也可以是文件或者命令的輸出
標(biāo)準(zhǔn)輸出(STDOUT) 1 默認(rèn)輸出到屏幕
錯(cuò)誤輸出(STDERR) 2 默認(rèn)輸出到屏幕
文件名稱(filename) 3+

進(jìn)程將從標(biāo)準(zhǔn)輸入中得到數(shù)據(jù),將正常輸出打印至屏幕終端,將錯(cuò)誤的輸出信息也打印至屏幕終端。

  • 輸出重定向:
    輸出重弄定向,改變輸出內(nèi)容的位置。輸出重定向的幾種方式:
類(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)更改為指定的文件或命令
例如:
[root@wyw ~]# echo "my name is wyw" > wyw.txt  新建wyw.txt,并將>左邊的字符寫(xiě)入到文件中。目錄下無(wú)文件,自動(dòng)創(chuàng)建文件
[root@wyw ~]# cat wyw.txt 
my name is wyw
[root@wyw ~]# echo "my name is wyw" 1> wyw.txt
[root@wyw ~]# cat wyw.txt 
my name is wyw
從這個(gè)例子里面可以可以證明的是>與1>在本質(zhì)上是一樣的,但是>會(huì)覆蓋上一次的輸入。
[root@wyw ~]# cat wyw.txt 
my name is wyw
[root@wyw ~]# echo "123" > wyw.txt 
[root@wyw ~]# cat wyw.txt 
123
重新輸如一段東西后,>c重定向后,發(fā)現(xiàn)新輸入的內(nèi)容覆蓋了上一次的內(nèi)容。
總結(jié):重定向符>和1>都為輸出重定向;
     被輸入的文件有則直接輸入,無(wú)則自動(dòng)創(chuàng)建該文件并輸入;
     將符號(hào)左邊的字符串輸入到右邊文件中且覆蓋原文件。

追加輸出重定向 >>與1>>
當(dāng)我們使用>>或者1>>,就可以在上一次的內(nèi)容后追加一行新輸入的內(nèi)容
[root@wyw ~]# echo "my name is wyw" >> wyw.txt 
[root@wyw ~]# cat wyw.txt 
123
my name is wyw
[root@wyw ~]# echo "my name is dpp" 1>> wyw.txt 
[root@wyw ~]# cat wyw.txt 
123
my name is wyw
my name is dpp
使用>>發(fā)現(xiàn)新輸入的內(nèi)容并沒(méi)有覆蓋原有的文件內(nèi)容,而是在原先的文件內(nèi)容后加了一行。
也同時(shí)發(fā)現(xiàn)>>與1>>的作用是相同的。
小結(jié):追加輸出重定向>>和1>>,將內(nèi)容追加到指定文件中最后一行的下一行,不會(huì)覆蓋源文件;
指定目錄下有源文件直接追加,沒(méi)有則自定創(chuàng)建文件并追加內(nèi)容。
  • 標(biāo)準(zhǔn)錯(cuò)誤重定向2>
[root@wyw ~]# echo "hello" > hello.txt
[root@wyw ~]# cat hello.txt 
hello
[root@wyw ~]# qecho hi
-bash: qecho: command not found
[root@wyw ~]# qecho hi 2>hello.txt
[root@wyw ~]# cat hello.txt 
-bash: qecho: command not found
//將錯(cuò)誤重定向到指定文件中并覆蓋原文件內(nèi)容。
小結(jié):標(biāo)準(zhǔn)錯(cuò)誤輸出重定向和錯(cuò)誤追加重定向都是將執(zhí)行錯(cuò)誤的提示內(nèi)
容放入指定文件中,故障排查,區(qū)別在于一個(gè)是覆蓋一個(gè)是追加。
錯(cuò)誤追加重定向 2>>
[root@wyw ~]# cat wyw.txt 
my name is wyw
[root@wyw ~]# qecho hello 2>>wyw.txt 
[root@wyw ~]# cat wyw.txt 
my name is wyw
-bash: qecho: command not found
//將錯(cuò)誤追加到指定文件中
小結(jié):標(biāo)準(zhǔn)錯(cuò)誤輸出重定向和錯(cuò)誤追加重定向都是將執(zhí)行錯(cuò)誤的提示內(nèi)

容放入指定文件中,故障排查,區(qū)別在于一個(gè)是覆蓋一個(gè)是追加。
  • 標(biāo)準(zhǔn)輸入重定向
    輸入重定向,即原本從鍵盤(pán)等上獲得的輸入信息,重定向由命令的輸出作為輸入。< 等價(jià) 0<
沒(méi)有改變輸入的方向,默認(rèn)鍵盤(pán)
[root@wyw ~]# mail wyw
Subject: hello
hi 112
aaa
bdjdjs
.         結(jié)束
EOT
# 檢查是否收到郵件
[root@wyw ~]# su - wyw
[wyw@wyw ~]$ mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/wyw": 1 message 1 new
>N  1 root                  Fri Aug  9 16:13  20/572   "hello"
# 輸入重定向,來(lái)自于文件
[wyw@wyw ~]$ mail -s "wyw.txt" wyw < /etc/hosts
[wyw@wyw ~]$ cat /etc/hosts
You have new mail in /var/spool/mail/wyw
小結(jié):<是用來(lái)將符號(hào)右側(cè)文本的內(nèi)容作為左側(cè)命令的執(zhí)行條件;
<<是方便輸入多行內(nèi)容到指定文件中。

進(jìn)程管道技術(shù)


  • 1.什么是管道
    管道操作符號(hào) "|" ,主要用來(lái)連接左右兩個(gè)命令, 將左側(cè)的命令的標(biāo)準(zhǔn)輸出, 交給右側(cè)命令的標(biāo)準(zhǔn)輸入(無(wú)法傳遞標(biāo)準(zhǔn)錯(cuò)誤輸出至后者命令)
  • 2.管道流程示意圖
image
  • 3.管道使用案例
    案例1: 將/etc/passwd 中的用戶按 UID 大小排序
[root@wyw ~]# sort -t":" -k3 -n /etc/passwd
[root@wyw ~]# sort -t":" -k3 -n /etc/passwd -r
[root@wyw ~]# sort -t":" -k3 -n /etc/passwd |head

案例2: 統(tǒng)計(jì)當(dāng)前/etc/passwd 中用戶使用的 shell 類(lèi)型

#思路:取出第七列(shell) | 排序(把相同歸類(lèi))| 去重
[root@wyw ~]# awk -F: '{print $7}' /etc/passwd
[root@wyw ~]# awk -F: '{print $7}' /etc/passwd |sort
[root@wyw ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq
[root@wyw ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq -c
  • 4.管道中的tee技術(shù)
image
#選項(xiàng): -a追加
[root@wyw ~]# ip addr |grep 'inet ' |tee ip.txt |awk -F"/" '{print $1}' |awk '{print $2}'
127.0.0.1
10.0.0.100

[root@wyw ~]# 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@wyw ~]# date > date.txt    #直接將內(nèi)容寫(xiě)入date.txt文件中
[root@wyw ~]# 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)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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