linux I/O重定向及管道

一,I/O重定向

  • 重定向正常輸出c++

    • > :覆蓋以存在文件的內容,很危險的操做shell

    • >>:若是文件已經存在,則是在原內容的最後追加。bash

    • 能夠禁止>的覆蓋行爲,使用set -C。只在當前會話有效。微信

      set +C恢復覆蓋行爲。學習

      # set -C
      # cat /etc/issue > /tmp/is1
      -bash: /tmp/is1: cannot overwrite existing file
      # cat /etc/issue >| /tmp/is1
    • >|:set -C已經禁止了覆蓋,可是確認就是要覆蓋,能夠使用。code

  • 重定向錯誤輸出input

    • 2>:覆蓋以存在文件的內容,很危險的操做
    • 2>>:若是文件已經存在,則是在原內容的最後追加。
    • 2>|:強制覆蓋
  • 合併重定向正常輸出和錯誤輸出it

    • &>:覆蓋以存在文件的內容,很危險的操做
    • &>>:若是文件已經存在,則是在原內容的最後追加。
    • &>|:不支持,語法報錯。
  • 把錯誤輸出,重定向到正常輸出:2>&1io

    # cat /etc/issue2 >> /tmp/is1 2>&1

    若是命令產生的是正常輸出,則重定向到/tmp/is1;若是產生的是錯誤輸出,則把錯誤輸出重定向到正常輸出。因爲正常輸出已經重定向到了/tmp/is1了,因此錯誤輸出也重定向到了/tmp/is1.class

  • 重定向輸入:<

    支持文件做爲參數的命令,能夠不使用< ,也可以重定向輸入,好比cat

    # cat < /etc/issue
    \S
    Kernel \r on an \m
    # cat /etc/issue
    \S
    Kernel \r on an \m

    不支持文件做爲參數的命令,必須明確使用<,纔可以重定向輸入。好比tr

    tr命令用途:替換或者刪除特定的字符

    語法:tr [OPTION]... SET1 [SET2]

    • 把輸入的1替換成2,把輸入的2替換成4

      $ tr [12] [34]
      12//輸入的12
      34//被替換成了34
      22//輸入的22
      44//被替換成了44
    • 利用重定向,把文件裏的小寫字母,所有替換成相應的大寫字母,把結果顯示到標準輸出。

      # cat /etc/issue
      \S
      Kernel \r on an \m
      # tr [[:lower:]] [[:upper:]] < /etc/issue
      \S
      KERNEL \R ON AN \M
    • 利用重定向,把文件裏的小寫字母,所有刪除後,把結果顯示到標準輸出。

      # cat /etc/issue
      \S
      Kernel \r on an \m
      # tr -d [a-z] < /etc/issue
      \S
      K \   \
  • <<:是幹什麼的?<<後面的詞做爲結尾,把內容重定向到文件裏

    # cat > /tmp/is1.out << EOF
    > hello
    > cat cat
    > EOF
    # cat /tmp/is1.out
    hello
    cat cat
  • 特殊設備:/dev/null

    重定向到/dev/null,就至關於消失了。

    在shell腳本程序裏,當關心的是,命令的執行結果(成功,仍是失敗),而不是命令執行後的輸出的時候,就能夠把命令的輸出重定向到/dev/null裏。

    例子:只想知道/etc/passwd文件裏是否有第一行,而不關心第一行的內容時,使用下面的命令。

    # head -1 /etc/passwds &> /dev/null
    # echo $?
    1
    # head -1 /etc/passwd &> /dev/null
    # echo $?
    0

二,管道

鏈接程序,把前一個命令的輸出做爲後一個命令的輸入。

command1 | command2 | command3 ...

例子1:把cat的輸出,做爲tr的輸入

# cat /etc/issue
\S
Kernel \r on an \m
# cat /etc/issue | tr [a-z] [A-Z]
\S
KERNEL \R ON AN \M

例子:把who的輸出,做爲tail的輸入,再把tail的輸出,做爲tr的輸入。

# who
ys       :0           2019-12-16 10:22 (:0)
ys       pts/0        2019-12-16 10:22 (:0)
root     pts/1        2019-12-16 10:23 ()
# who | tail -2
aa       pts/0        2019-12-16 10:22 (:0)
root     pts/1        2019-12-16 10:23 ()
# who | tail -2 | tr [a-z] [A-Z]
AA       PTS/0        2019-12-16 10:22 (:0)
ROOT     PTS/1        2019-12-16 10:23 ()

重定向後,原來命令的輸出就沒有了,可以保存上一個命令的輸出嗎?使用tee命令。

tee:read from standard input and write to standard output and files。從標準輸入讀取,而後寫入到標準輸出和文件中。

例子:保留cat的輸出,並把cat的輸出,傳遞給tr命令

# cat /etc/issue | tee /tmp/is3.out | tr [a-z] [A-Z]
\S
KERNEL \R ON AN \M
# cat /tmp/is3.out
\S
Kernel \r on an \m

練習1:把/etc/passwd文件的前6行的信息轉換爲大寫字母后輸出

# head -6 /etc/passwd | tr [a-z] [A-Z]
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN
ADM:X:3:4:ADM:/VAR/ADM:/SBIN/NOLOGIN
LP:X:4:7:LP:/VAR/SPOOL/LPD:/SBIN/NOLOGIN
SYNC:X:5:0:SYNC:/SBIN:/BIN/SYNC

c/c++ 學習互助QQ羣:877684253

本人微信:xiaoshitou5854

相關文章
相關標籤/搜索