Linux重定向--day13

  • 1.重定向概述

  • 1.什么是重定向
    將原本要輸出到屏幕的數(shù)據(jù)信息,重新定向到某個指定的文件中。

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

    • 1.當屏幕輸出的信息很重要,而且希望保存重要的信息時;
      2.后臺執(zhí)行中的程序,不希望他干擾屏幕正常的輸出結(jié)果時;
      3.系統(tǒng)的例行命令, 例如定時任務的執(zhí)行結(jié)果,希望可以存下來時;
      4.一些執(zhí)行命令,我們已經(jīng)知道他可能出現(xiàn)錯誤信息, 想將他直接丟棄時;
      5.錯誤日志與正確日志需要分別輸出至不同的文件保存時;*
  • 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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

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