ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 管線命令 ( pipe )

管線命令 ( pipe )

原创 Linux操作系统 作者:wwd_wang 时间:2009-09-22 10:12:35 0 删除 编辑
管線命令 ( pipe )
    就如同前面所說的, bash 命令執行的時候有輸出的資料會出現!那麼如果這群資料必需要經過幾道手續之後才能得到我們所想要的格式,應該如何來設定?這就牽涉到管線命令的問題了( pipe ),管線命令使用的是『 | 』這個界定符號!另外,管線命令與『連續下達命令』是不一樣的呦!這點底下我們會再說明。底下我們先舉一個例子來說明一下簡單的管線命令。
    假設我們要讀取 last 這個指令中,那個 root 登入的『次數』應該怎麼作?注意呦!我們只需要『次數』。那麼我所進行的步驟是:
    1. 執行 last ,將所有這個月的所有人登入資料取出來;
    2. 使用 grep 將上面的輸出資料(stdout)當中的 root 擷取出來,其他的不要;
    3. 使用 wc 這個可以計算行數的指令將上一步的資料計算行數!
    由於 last 的輸出是一行代表一次登入,所以只要計算幾行就代表登入幾次的意思,所以囉!經由上面三個步驟,將 last 資料逐步的篩選,就可以得到我們的資料了!整個命令可以寫成如下:
     
    [test @test bin]# last
    [test @test bin]# last | grep root
    [test @test bin]# last | grep root | wc -l 
     
    你可以分別執行『 last 』然後再逐步增加為『 last | grep root 』,最後到上面那一行,那麼就馬上可以清楚的知道為何會這麼做囉!這個管線命令『 | 』僅能處理經由前面一個指令傳來的正確資訊,也就是 standard output ( STDOUT ) 的資訊,對於 stdandard error 並沒有直接處理的能力,請記得。那麼整體的管線命令可以使用下圖表示之:
      
    在每個管線的部分都是『指令』呢!而後一個指令的輸入乃是由前一個指令的輸出而來的!底下我們來談一談一些基本的管線命令指令介紹:

  • cut
    語法
    [root @test /root ]# cut -d "分隔字元" [-cf] fields
    參數說明:
    -d  :後面接的是用來分隔的字元,預設是『空白字元』
    -c  :後面接的是『第幾個字元』
    -f  :後面接的是第幾個區塊?
    範例:
    [root @test /root]# cat /etc/passwd | cut -d ":" -f 1 
    將 passwd 這個檔案裡面,每一行裡頭的 : 用來作為分隔號,
    而列出第一個區塊!也就是姓名所在啦!

    [root @test /root]# last | cut -d " " -f1 
    以空白字元為分隔,並列出第一個區間!

    [root @test /root]# last | cut -c1-20
    將 last 之後的資料,每一行的 1-20 個字元取出來!

    說明
    這個 cut 實在很好用!不過,說真的,除非你常常在分析 log 檔案,否則使用到 cut 的機會並不多!好了! cut 主要的用途在於將『同一行裡面的資料進行分解!』,最常使用在分析一些數據或文字資料的時候!這是因為有時候我們會以某些字元當作分割的參數,然後來將資料加以切割,以取得我們所需要的資料。我也很常使用這個功能呢!尤其是在分析 log 檔案的時候!

  • sort
    語法
    [root @test /root ]# sort [-t 分隔符號] [(+起始)(-結束)] [-nru]
    參數說明:
    -t 分隔符號:使用分隔符號來隔開不同區間,預設是 tab
    +start -end:由第 start 區間排序到 end 區間
    -n         :使用『純數字』排序(否則就會以文字型態來排序)
    -r         :反向排序
    -u         :相同出現的一行,只列出一次!
    範例:
    [root @test /root]# cat /etc/passwd | sort
    將列出來的個人帳號排序!

    [root @test /root]# cat /etc/passwd | sort -t: +2n
    將個人帳號中,以使用者 ID 來排序(以 : 來分隔,第三個為 ID ,
    但第一個代號為 0 之故)

    [root @test /root]# cat /etc/passwd | sort -t: +2nr
    反相排序囉!

    說明
    sort 同樣是很常用的指令呢!因為我們常常需要比較一些資訊啦!舉個上面的第二個例子來說好了!今天假設你有很多的帳號,而且你想要知道最大的使用者 ID 目前到哪一號了!呵呵!使用 sort 一下子就可以知道答案咯!當然其使用還不止此啦!有空的話不妨玩一玩!

  • wc
    語法
    [root @test /root ]# wc [-lmw]
    參數說明:
    -l   :多少行
    -m   :多少字元
    -w   :多少字?
    範例:
    [root @test /root]# cat /etc/passwd | wc -l
    這個檔案裡頭有多少行?

    [root @test /root]# cat /etc/passwd | wc -w 
    這個檔案裡頭有多少字!?

    說明
    wc 也可以當作指令?呵呵!這可不是上洗手間的 WC 呢!這是相當有用的計算檔案內容的一個工具組喔!舉個例子來說,當你要知道目前你的帳號檔案中有多少個帳號時,就使用上面的 wc -l 啦!因為 /etc/passwd 裡頭一行代表一個使用者呀!所以知道行數就曉得有多少的帳號在裡頭了!而如果要計算一個檔案裡頭有多少個字元時,呵呵!就使用 wc -w 這個參數吧!

    • uniq
      語法
      [root @test /root ]# uniq
      參數說明:
      範例:
      [root @test /root]# last | cut -d" " -f1 | sort | uniq
      說明
      這個指令用來將『重複的行刪除掉只顯示一個』,舉個例子來說,你要知道這個月份登入你主機的使用者有誰,而不在乎他的登入次數,那麼就使用上面的範例,(1)先將所有的資料列出;(2)再將人名獨立出來;(3)經過排序;(4)只顯示一個!由於這個指令是在將重複的東西減少,所以當然需要『配合排序過的檔案』來處理囉!

    • tee
      語法
      [root @test /root ]# last | tee last.list | cut -d " " -f1
      參數說明:
      範例:
      [root @test /root]# last | tee last.list | cut -d " " -f1
      說明
      有沒有發現在命令重導向的時候,如果我們要將資料送出到檔案的時候,螢幕上就不會出現任何的資料!那麼如果我們需要將資料同時顯示在螢幕上跟檔案中呢?呵呵!這個時候就需要 tee 這個指令囉!使用 last 可以查看到這個月份的登入資料,而使用了 tee 之後,會將資料同時傳給下一個命令去執行,也會將資料寫入 last.list 這個檔案中!也是個好幫手!

    • tr
      語法
      [root @test /root ]# tr [-ds] SET1
      參數說明:
      -d  :刪除 SET1 這個字串
      -s  :取代掉重複的字元!
      範例:
      [root @test /root]# last | tr '[a-z]' '[A-Z]'         <==將小寫改成大寫
      [root @test /root]# cat /etc/passwd | tr -d :       <==嘿嘿! : 這個符號在 /etc/passwd 中不見了!
      [root @test /root]# cat /home/test/dostxt | tr -d '\r' > dostxt-noM   <==將 DOS 檔案的字尾符號 ^M 的符號去除!
      說明
      其實這個指令也可以寫在『正規表示法』裡頭!因為他也是由正規表示法的方式來取代資料的!以上面的例子來說,使用 [] 可以設定一串字呢!也常常用來取代檔案中的怪異符號!例如上面第三個例子當中,可以去除 DOS 檔案留下來的 ^M 這個斷行的符號!這東西相當的有用!相信處理 Linux & Windows 系統中的人們最麻煩的一件事就是這個事情啦!亦即是 DOS 底下會自動的在每行行尾加入 ^M 這個斷行符號!這個時候我們可以使用這個 tr 來將 ^M 去除! ^M 可以使用 \r 來代替之!

    • split
      語法
      [root @test /root ]# split [-bl] 輸入檔案 輸出檔案前導字元
      參數說明:
      -b  :以檔案 size 來分
      -l  :以行數來分
      範例:
      [root @test /root]# split -l 5 /etc/passwd test   <==會產生 testaa, testab, testac... 等等的檔案
      說明
      在 Windows 的情況下,你要將檔案分割需要如何作?!傷腦筋吧!呵呵!在 Linux 底下就簡單的多了!你要將檔案分割的話,那麼就使用 -b size 來將一個分割的檔案限制其大小,如果是行數的話,那麼就使用 -l line 來分割!好用的很!如此一來,你就可以輕易的將你的檔案分割成 floppy 的大小,方便你 copy 囉!
    管線命令在 bash 的連續的處理程序中是相當重要的!另外,在 log file 的分析當中也是相當重要的一環,所以請特別留意!好嘛!?

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12137615/viewspace-615246/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 命令重導向
请登录后发表评论 登录
全部评论

注册时间:2008-05-08

  • 博文量
    236
  • 访问量
    193207