1. 程式人生 > >易學筆記-Linux命令-第7章:重定向

易學筆記-Linux命令-第7章:重定向

第7章:重定向

  1. 概念:Linux中任何的一個東西都是檔案,輸入和輸出的基礎也都是檔案。而重定向指的是從輸入和輸出的標準檔案切換到一般檔案
  2. 標準化的輸入和輸出
    1. 標準的輸入:stdin:通常指的是鍵盤
    2. 標準的輸出:stdout:通常指的是螢幕
    3. 標準的錯誤:stderr:通常指的是螢幕

第7章:重定向/7.1 重定向標準輸出

  1. 語法: > 具體的檔名
  2. 舉例:

    [[email protected] ~]# ls -l > ls-output.txt

    [[email protected] ~]# vi ls-output.txt

    total 409916

    -rw-r--r--. 1 root root        10 Aug 21 03:42 ln_123

    -rw-r--r--. 1 root root         0 Aug 27 01:42 ls-output.txt

    drwxr-xr-x. 2 root root        21 Aug 21 03:52 me

    -rw-r--r--. 1 root root      7166 Jun  7 18:33 mylog

    -rw-r--r--. 1 root root 419737600 May 14 11:32 mysql.tar.gz

    lrwxrwxrwx. 1 root root        15 Aug 21 03:36 s_ln_123 -> wys_bak/123.txt

    lrwxrwxrwx. 1 root root         8 Aug 21 03:37 s_ln_dir -> wys_bak/

    drwxr-xr-x. 7 root root      4096 Aug 21 04:50 wys_bak

追加式重定向:

  1. 語法: >> 檔名
  2. 舉例:

    [[email protected] /]# ll -l >> /root/ls-output.txt

    [[email protected] ~]# vi ls-output.txt

    total 409916

    -rw-r--r--. 1 root root        10 Aug 21 03:42 ln_123

    -rw-r--r--. 1 root root         0 Aug 27 01:46 ls-output.txt

    drwxr-xr-x. 2 root root        21 Aug 21 03:52 me

    -rw-r--r--. 1 root root      7166 Jun  7 18:33 mylog

    -rw-r--r--. 1 root root 419737600 May 14 11:32 mysql.tar.gz

    lrwxrwxrwx. 1 root root        15 Aug 21 03:36 s_ln_123 -> wys_bak/123.txt

    lrwxrwxrwx. 1 root root         8 Aug 21 03:37 s_ln_dir -> wys_bak/

    drwxr-xr-x. 7 root root      4096 Aug 21 04:50 wys_bak

    total 36  新增的內容

    drwxr-xr-x.   8 root root 4096 Apr 24 16:10 app

    lrwxrwxrwx.   1 root root    7 May 21 11:03 bin -> usr/bin

    dr-xr-xr-x.   5 root root 4096 May 31 12:20 boot

    drwx--x--x.   3 root root   19 May  3 17:00 cutome-path

    drw-------.   9 root root 4096 May 31 16:04 data

    drwxr-xr-x.  19 root root 3220 Aug 16 01:10 dev

    drwxr-xr-x.   2 root root   90 Apr 16 10:03 dockercmd

    drwxr-xr-x.   4 root root   32 Apr 13 11:21 docker-hub

    drwxr-xr-x. 101 root root 8192 Aug 14 17:40 etc

    drwxr-xr-x.   8 root root   88 Aug 14 17:40 home

    lrwxrwxrwx.   1 root root    7 May 21 11:03 lib -> usr/lib

    lrwxrwxrwx.   1 root root    9 May 21 11:03 lib64 -> usr/lib64

    drwxr-xr-x.   2 root root    6 Apr 11 12:59 media

    drwxr-xr-x.   2 root root    6 Apr 11 12:59 mnt

    drwxr-xr-x.   6 root root   56 Jun  8 11:16 opt


第7章:重定向/7.2 重定向標準錯誤

  1. 沒有專用的重定向錯誤操作符,需要配合檔案描述符使用,檔案描述符說明:
    1. 0:標準輸入
    2. 1:標準輸出
    3. 2:標準錯誤
  2. 覆蓋式:
    1. 語法: 2>
    2. 舉例:

      [[email protected] ~]# xxx 2> /root/ls-output.txt

      [[email protected] ~]# vi ls-output.txt

      -bash: xxx: command not found

  3. 追加式:
    1. 語法:2>>
    2. 舉例:

      [[email protected] ~]# aaa 2>> /root/ls-output.txt

      [[email protected] ~]# vi ls-output.txt

      -bash: xxx: command not found

      -bash: aaa: command not found


第7章:重定向/7.3 重定向標準輸出和標準錯誤

  1. 覆蓋式:
    1. 舊版:
      1. 語法:> 檔名 2>&1 
      2. 舉例:

        [[email protected] ~]# ls -l  /aa /bin/usr /bin/temp/ . /root/mylog > ls-output.txt 2>&1

        [[email protected] ~]# vi ls-output.txt

        ls: cannot access /aa: No such file or directory

        ls: cannot access /bin/usr: No such file or directory

        ls: cannot access /bin/temp/: No such file or directory  先輸出錯誤

        -rw-r--r--.  1 root root 7166 Jun  7 18:33 /root/mylog   再輸出正確的

        .:

        total 409920

        -rw-r--r--. 1 root root        10 Aug 21 03:42 ln_123

        -rw-r--r--. 1 root root       159 Aug 27 02:08 ls-output.txt

        drwxr-xr-x. 2 root root        21 Aug 21 03:52 me

        -rw-r--r--. 1 root root      7166 Jun  7 18:33 mylog

        -rw-r--r--. 1 root root 419737600 May 14 11:32 mysql.tar.gz

        lrwxrwxrwx. 1 root root        15 Aug 21 03:36 s_ln_123 -> wys_bak/123.txt

        lrwxrwxrwx. 1 root root         8 Aug 21 03:37 s_ln_dir -> wys_bak/

        drwxr-xr-x. 7 root root      4096 Aug 21 04:50 wys_bak

    2. 新版:
      1. 語法:&> 檔名
      2. 舉例:

        [[email protected] ~]# ls -l  /aa /bin/usr  .  &> ls-output.txt

        [[email protected] ~]# vi ls-output.txt

        ls: cannot access /aa: No such file or directory

        ls: cannot access /bin/usr: No such file or directory 先輸出錯誤

        .:   再輸出正確的

        total 409920

        -rw-r--r--. 1 root root        10 Aug 21 03:42 ln_123

        -rw-r--r--. 1 root root       103 Aug 27 02:10 ls-output.txt

        drwxr-xr-x. 2 root root        21 Aug 21 03:52 me

        -rw-r--r--. 1 root root      7166 Jun  7 18:33 mylog

        -rw-r--r--. 1 root root 419737600 May 14 11:32 mysql.tar.gz

        lrwxrwxrwx. 1 root root        15 Aug 21 03:36 s_ln_123 -> wys_bak/123.txt

        lrwxrwxrwx. 1 root root         8 Aug 21 03:37 s_ln_dir -> wys_bak/

        drwxr-xr-x. 7 root root      4096 Aug 21 04:50 wys_bak

  2. 追加式:
    1. 舊版:>>  檔名  2>&1 
    2. 新版:&>>  檔名

第7章:重定向/7.4 不產生輸出:/dev/null

 


第7章:重定向/7.5 拼接多個輸出

  1. 舉例1:錯誤輸出到檔案1 標準錯誤到檔案2
    1. 語法: 1>檔案2  2> 檔案1 
    2. 舉例:

      [[email protected] ~]# ls -l  /aa /bin/usr  .  2> err-output.txt   1> ls-output.txt

      [[email protected] ~]# vi err-output.txt

      ls: cannot access /aa: No such file or directory

      ls: cannot access /bin/usr: No such file or directory

      [[email protected] ~]# vi ls-output.txt

      .:

      total 409920

      -rw-r--r--. 1 root root       103 Aug 27 02:32 err-output.txt

      -rw-r--r--. 1 root root        10 Aug 21 03:42 ln_123

      -rw-r--r--. 1 root root         0 Aug 27 02:32 ls-output.txt

      drwxr-xr-x. 2 root root        21 Aug 21 03:52 me

      -rw-r--r--. 1 root root      7166 Jun  7 18:33 mylog

      -rw-r--r--. 1 root root 419737600 May 14 11:32 mysql.tar.gz

      lrwxrwxrwx. 1 root root        15 Aug 21 03:36 s_ln_123 -> wys_bak/123.txt

      lrwxrwxrwx. 1 root root         8 Aug 21 03:37 s_ln_dir -> wys_bak/

      drwxr-xr-x. 7 root root      4096 Aug 21 04:50 wys_bak

  2. 舉例2:不需要錯誤輸出  標準錯誤到檔案2
    1. 語法: 1>檔案2  2> /dev/null
    2. 舉例:

      [[email protected] ~]# ls -l  /aa /bin/usr  .  2> /dev/null   1> ls-output.txt

      [[email protected] ~]# vi ls-output.txt

      .:

      total 409916

      -rw-r--r--. 1 root root        10 Aug 21 03:42 ln_123

      -rw-r--r--. 1 root root         0 Aug 27 02:31 ls-output.txt

      drwxr-xr-x. 2 root root        21 Aug 21 03:52 me

      -rw-r--r--. 1 root root      7166 Jun  7 18:33 mylog

      -rw-r--r--. 1 root root 419737600 May 14 11:32 mysql.tar.gz

      lrwxrwxrwx. 1 root root        15 Aug 21 03:36 s_ln_123 -> wys_bak/123.txt

      lrwxrwxrwx. 1 root root         8 Aug 21 03:37 s_ln_dir -> wys_bak/

      drwxr-xr-x. 7 root root      4096 Aug 21 04:50 wys_bak


第7章:重定向/7.6 cat 命令

  1. 作用:讀取一個或者多個檔案,然後複製它們到標準輸出
  2. 用cat 命令實現多個檔案標準輸出
    1. 格式:cat file1 file2
    2. 舉例:

      [[email protected] ~]# cat ln_123  test.txt

      112

      11222   ln_123檔案內容

      idadada 2dfada dada

      dada 1122

      womd

      [[email protected] ~]#  test.txt檔案內容

  3. 用cat 命令實現多個檔案重定向
    1. 格式: cat file1 file2 > 檔名
    2. 舉例:

      [[email protected] ~]# cat ln_123  test.txt > mycat

      [[email protected] ~]# cat mycat

      112

      11222

      idadada 2dfada dada

      dada 1122

      womd

      [[email protected] ~]#

  4. cat命令把標準輸入的內容重定向到檔案
    1. 覆蓋式輸入:

      [[email protected] ~]# cat > test.txt

      accfc 

      ddd

      ddd

      www

      ^C

      [[email protected] ~]# cat test.txt

      accfc

      ddd

      ddd

      www

    2. 追加式輸入

       [[email protected] ~]# cat >> test.txt

      dadada

      dadad

      dadad

      [[email protected] ~]# cat test.txt

      accfc

      ddd

      ddd

      www

      dadada

      dadad

      dadad

  5.  

第7章:重定向/7.7 管道

  1. 作用:將一個命令的標準輸出作為另外一個命令的標準輸入
  2. 格式:command1|command2
    1. command1:產生標準輸出
    2. command2:需要一個標準輸入
  3. 舉例:
    1. command1:產生標準輸出

      [[email protected] ~]# ls -l /usr/bin

      -rwxr-xr-x. 2 root root      185488 Apr 11 13:24 zipinfo

      -rwxr-xr-x. 1 root root       12040 Jun 10  2014 zipmerge

      -rwxr-xr-x. 1 root root       95984 Nov  6  2016 zipnote

      -rwxr-xr-x. 1 root root      100096 Nov  6  2016 zipsplit

      -rwxr-xr-x. 1 root root       11880 Jun 10  2014 ziptorrent

      -rwxr-xr-x. 1 root root        2041 Apr 11 08:01 zless

      -rwxr-xr-x. 1 root root        2859 Apr 11 08:01 zmore

      -rwxr-xr-x. 1 root root        5343 Apr 11 08:01 znew

      lrwxrwxrwx. 1 root root           6 Aug 31  2017 zsoelim -> soelim

    2. command2:需要一個標準輸入

      [[email protected] ~]# less mycat

      11222

      idadada 2dfada dada

      dada 1122

      womd

      mycat (END

    3. command1|command2

      [[email protected] ~]# ls -l /usr/bin|less

      total 286160

      -rwxr-xr-x. 1 root root       41480 Apr 11 12:35 [

      -rwxr-xr-x. 1 root root      107856 Aug  3  2017 a2p

      -rwxr-xr-x. 1 root root       52720 Apr 21 02:11 ab

      -rwxr-xr-x. 1 root root       11336 Apr 27 22:53 abrt-action-analyze-backtrace

      -rwxr-xr-x. 1 root root       11320 Apr 27 22:53 abrt-action-analyze-c

      -rwxr-xr-x. 1 root root        1345 Apr 27 22:53 abrt-action-analyze-ccpp-local

      -rwxr-xr-x. 1 root root        6821 Apr 27 22:53 abrt-action-analyze-core

    4.  

第7章:重定向/7.8 過濾器/7.8.1 sort:可能重複排序

  1. 作用:在管理( 第7章:重定向/7.7 管道)的基礎上,將一個命令標準輸出(可能多個)經過處理後(比如排序)再作為另外一個命令的輸入
  2. 格式:commond1|sort|commond2
  3. 舉例:

    [[email protected] ~]# ls /bin /usr/bin |sort|less

    abrt-action-analyze-xorg

    abrt-action-check-oops-for-hw-error

    abrt-action-check-oops-for-hw-error

    abrt-action-generate-backtrace

    abrt-action-generate-backtrace

    abrt-action-generate-core-backtrace

    abrt-action-generate-core-backtrace

    abrt-action-install-debuginfo

    abrt-action-install-debuginfo

    abrt-action-list-dsos

    :


第7章:重定向/7.8 過濾器/7.8.2 uniq:去除重複的排序

  1. 格式:commond1|sort|uniq|commond1
  2. 舉例:

    [[email protected] ~]# ls /bin /usr/bin |sort|uniq|less

    abrt-cli

    abrt-dump-oops

    abrt-dump-xorg

    abrt-handle-upload

    abrt-merge-pstoreoops

    abrt-retrace-client

    abrt-watch-log

    abs2rel

    ac

    acyclic

    addr2line

    :


第7章:重定向/7.8 過濾器/7.8.3 wc:統計行數、字數、位元組數

  1. 格式:commond1|過濾器1|過濾器2|wc
  2. 關於wc 命令
    1. 命令:  wc 操作 檔名1  檔名2
    2. 操作
      1. -l :顯示行數
      2. -c : 顯示位元組數
      3. -m:顯示字元數
    3. 舉例:

      [[email protected] ~]# wc ln_123  mycat

       2  2 10 ln_123   1列:行數 2列:字元 3列:位元組數

       5  8 47 mycat

       7 10 57 total

  3. 舉例:

    [[email protected] ~]# ls /bin /usr/bin |sort|uniq|wc

       1150    1149   10835  1列:行數 2列:字元 3列:位元組數

    [[email protected] ~]#


第7章:重定向/7.8 過濾器/7.8.4 grep 過濾

  1. grep命令:後面章節會詳細講解grep
    1. 格式:grep pattern 檔案1 檔案2 。。。
    2. 舉例:

      [[email protected] ~]# grep 12 ln_123

      112

      11222

  2. 過濾器中使用grep
    1. 舉例

      [[email protected] ~]# ls /bin /usr/bin |sort|uniq|grep zip

      bunzip2

      bzip2

      bzip2recover

      funzip

      gpg-zip

      gunzip

      gzip

      unzip

      unzipsfx

      zip

      zipcloak

      zipcmp

      zipgrep

      zipinfo

      zipmerge

      zipnote

      zipsplit

      ziptorrent


第7章:重定向/7.8 過濾器/7.8.5 head/tail 過濾

  1. head命令
    1. 格式:head 操作符 檔案1 檔案2
      1. 操作符:
        1. -n:檔案開始幾行
        2. -c:檔案開始的多個位元組
    2. 舉例:

      [[email protected] ~]# head -n 5 mylog  mycat

      ==> mylog <==

      .

      .

      JAVA Memory arguments: -Xms256m -Xmx512m  -XX:MaxPermSize=256m

      .

      server/common/derby/lib/derby.jar:/u01/oracle/weblogic/wlserver/server/lib/xqrl.jar

      ==> mycat <==

      112

      11222

      idadada 2dfada dada

      dada 1122

      womd

      [[email protected] ~]#

  2. tail命令
    1. 格式:tail 操作符 檔案1 檔案2
      1. 操作符:
        1. -n:檔案結尾幾行
        2. -c:檔案開始的多個位元組
    2. 舉例:

      [[email protected] ~]# tail-n 5 mylog  mycat

      ==> mylog <==

      .

      .

      JAVA Memory arguments: -Xms256m -Xmx512m  -XX:MaxPermSize=256m

      .

      server/common/derby/lib/derby.jar:/u01/oracle/weblogic/wlserver/server/lib/xqrl.jar

      ==> mycat <==

      112

      11222

      idadada 2dfada dada

      dada 1122

      womd

      [[email protected] ~]#

    3. 實時檢視檔案內容: tail -f  find
  3. 在管道中使用head/tail 

    [[email protected] ~]# ls /bin /usr/bin |head -n 5  輸出前面5個檔案

    /bin:

    [

    a2p

    ab

    abrt-action-analyze-backtrace

    [[email protected] ~]# ls /bin /usr/bin |tail -n 5 輸出後面5個檔案

    ziptorrent

    zless

    zmore

    znew

    zsoelim

    [[email protected] ~]#


第7章:重定向/7.8 過濾器/7.8.6 tee:重定向管道輸出結果到檔案

  1. 格式:commond1|....|tee 檔名1|tee 檔名2|commond...|
  2. 說明:tee 可以插入到管道的任意一個過程,捕捉管道最近的一次輸出,插入的位置不一樣捕捉輸出的結果也不一樣
  3. 舉例:
    1. 舉例1:捕捉ls 輸出結果

      [[email protected] ~]# ls /usr/bin |tee ls.txt|grep zip

      bunzip2

      bzip2

      bzip2recover

      funzip

      gpg-zip

      gunzip

      gzip

      unzip

      unzipsfx

      zip

      zipcloak

      zipcmp

      zipgrep

      zipinfo

      zipmerge

      zipnote

      zipsplit

      ziptorrent

      [[email protected] ~]# cat ls.txt

      yumdownloader

      yum-groups-manager

      zcat

      zcmp

      zdiff

      zegrep

      zfgrep

      zforce

      zgrep

      zip

      zipcloak

      zipcmp

      zipgrep

      zipinfo

      zipmerge

    2. 舉例2:捕捉grep 輸出結果

      [[email protected] ~]# ls /usr/bin |grep zip|tee ls.txt

      bunzip2

      bzip2

      bzip2recover

      funzip

      gpg-zip

      gunzip

      gzip

      unzip

      unzipsfx

      zip

      zipcloak

      zipcmp

      zipgrep

      zipinfo

      zipmerge

      zipnote

      zipsplit

      ziptorrent

      [[email protected] ~]# cat ls.txt

      bunzip2

      bzip2

      bzip2recover

      funzip

      gpg-zip

      gunzip

      gzip

      unzip

      unzipsfx

      zip

      zipcloak

      zipcmp

      zipgrep

      zipinfo

      zipmerge

      zipnote

      zipsplit

      ziptorrent

      [[email protected] ~]#