天天看點

linux指令實踐-cut

cut指令從檔案的每一行剪切位元組、字元和字段并将它們寫至标準輸出。它是以檔案的每一行作為處理對象的。 

  指令格式:cut [選項] [範圍] 檔案。選項用來指定機關(位元組、字元還是字段),範圍指定選項的位置。 

  常用的選項有:

  -b:指定以位元組為機關顯示選中内容

  -c:指定以字元為機關顯示選中内容

  -f:指定以字段為機關顯示選中内容

  -d:指定字段的分界符,預設為制表符

  其它的選項還有-n(僅和-b選項一起使用)、-s(僅和-f選項一起使用) 

  範圍表示:

  n:第n個位元組/字元/字段

  n-:從第n個位元組/字元/字段到最後一個位元組/字元/字段

  n-m:從第n個位元組/字元/字段到第m個位元組/字元/字段,包括m

  -m:從行的開頭到第m個位元組/字元/字段,包括m

  -:從行開頭到行的最後

  

  一、顯示passwd檔案中使用者名、密碼、使用者ID和使用者目錄。

passwd檔案每行分為七列,以:為分隔符;這七列依次是使用者名、密碼、使用者ID、組ID、使用者描述、使用者目錄、使用者bash。由于passwd檔案内容過多,我們這裡用sed顯示其中的1-6行。  

  二、顯示前兩個位元組或前兩個字元 

  看起來-b選項和-c選項沒什麼差別嘛。。其實不然,若檔案内容有漢字就可以看出來兩者的差别了。 

  三、

 

  你是不是有些疑惑:漢字不是占兩個位元組麼?cut -b 1-2 test1正好是顯示兩個位元組呀。。不錯,網上有很多資料都是這麼說的,而且它們會告訴你用cut -b 1-3就可以完整的顯示出一個漢字,原因是cut -b 1-2以位元組為機關來處理,字元被“切成兩半”,是以無法正常顯示。

  但是看了下面的圖檔,你或許會有不同的看法: 

     呵呵。。實在不好意思,貌似從utf-8到gb2312的編碼轉換沒有成功,但是沒關系,這不影響我們對為什麼cut -b 1-2不能正确顯示漢字的判斷。

 這個圖檔就可以說明-b和-c選項的差别:我們用cut -b 1-2 test1時,沒有顯示出漢字,但是換成-c選項則可以顯示兩個漢字。這就是-b(位元組)和-c(字元)之間的差別。

  我們看到編碼為utf-8的test1檔案第一行一共有5個漢字和3個字母,但wc -c統計是19個位元組,而編碼為iso-8859的test檔案統計為14個位元組!(wc -c在統計位元組時,結束符/換行符也作為一個位元組。) 

    這表明:在utf-8編碼下,漢字是占三個位元組的!

  大家可自己動手試驗一下,在utf-8編碼下,用cut -b 1-3可以顯示一個漢字,而在其它編碼如gb2312、iso-8859等編碼下,用cut -b 1-2就可以顯示一個漢字。

本文轉自 li_qinshan 51CTO部落格,原文連結:http://blog.51cto.com/share/177913

繼續閱讀